----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1.网络编程基础知识
网络编程的目的是直接或间接的通过网络协议与其他计算机进行通讯
重点问题,一 是如何定位网络主机,二 就是找到主机后如何可靠有效的进行数据传输。
Tcp/Up协议中Ip层负责网络主机的定位,数据传输的路由,由ip地址唯一确定主机。
目前流行的网络编程模型是 客户机服务器结构。即通信双方一方为服务器等待客户发出请求并给予响应,客户则在需要服务时想服务器提出申请。各种协议是为了进行网络中的数据交换而建立的规则 标准或约定。
OSi使用的协议:
应用层:远程登录协议Telent ,文件传输协议FTp ,超文本传输协议Http ,域名服务DNS,邮件传输协议SMTP
传输层:传输控制协议Tcp,用火狐数据协议UDP
Tcp:面向链接的可靠的传输协议
UP:是无连接的,不可靠的传输协议
2.Tcp简介
通过Tcp协议传输,得到的是一个顺序的无差错的数据流,发送方和接收方必须是成对的两个Socket之间建立连接。一个Socket(一般都是ServerSocket)等待建立连接,另一个Socket可以要求进行连接,一旦建立连接,就可以进行双向的数据传输,都可以进行发送和接收操作
我们不知道要对机器上的那个程序进行通信,所以有了端口号就可以唯一的确定某一个程序。确定好IP地址和对应的端口号之后我们就可以锁定用户的程序。
3.Socket通讯的一般过程
Server端监听摸个端口是否有连接请求,Client端向Serve端发出Coonect请求,Server向Client发回Accept消息,连接就建立起来了
工作过程:
(1)创建Socket;
(2)打开连接到Socekt的输入、输出流
(3)按照一定的协议对Socket进行读写操作
(4)关闭Socket
1 创建Socket
Socket(IntAddress address,int port) 发放中,Ip是服务端的地址,端口号是接收数据的端口号,这个方法一般用于客户端
ServerSocket(int port)端口号是服务端的端口,这个方法一般用于服务端
Socket s=ServerSocket.accpet();//这个方法尤其重要,接收客户端Socket对象,是阻塞式方法
2 打开连接Socket的输入输出流和读写操作
客户端
//由Socekt对象得到输入流
BufferedReader sin =new BuferedReader(new InputStreamReader(Socket.getInputStream()))
//由系统标准输入设备构输入缓冲流对象
BufferedReader is=new BuferedReader(new InputStreamReader(System.in())
//由Socekt对象得到输出流,并构造PrintWriter对象
PrintWriter os=newPrintWriter(socket.getOutputStream())
//从系统标准输入读入一字字符串
String s
s=sin.readeLine()
//将从系统标准输入读入的字符串输出到Server
while(!s.equal(":over"))
os.println(s);
//刷新输出流,使Server马上收到该字符串
os.flush()
//从Server端读入字符串,打印到输出上
System.out.println("server"+is.readLine())
服务端
/ /由Socekt对象得到输出流,并构造PrintWriter对象
PrintWriter os=newPrintWriter(socket.getOutputStream())
//由Socekt对象得到输入流
BufferedReader sin =new BuferedReader(new InputStreamReader(Socket.getInputStream()))
接下和输入端一下 先接受数据(通过Socket输入流),在向客户端发送数据(读入字符串打印到标准输出流上)
4.关闭
关闭Socket输出流
关闭Soceket输入流
关闭Socekt
客户与服务端的连接方式是固定的,但是由于我们需要实现各种功能,比如复制文本文件,复制图片MP3 或者直接打印,这时对于流对象的创建要视情况而定,对于输入输出流的创建要明确它的目的才能使用
Tcp传输最容易出现的问题
客户端连接上服务端,两端都在等待,没 有任何数据传输。
因为read方法或者readLine方法是阻塞式。
解决办法:
自定义结束标记
使用shutdownInput,shutdownOutput方法。
s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.