黑马程序员——java语言——网络编程
网络编程
网络编程的实现方式
网络编程有两种实现方式:即通过TCP协议和UDP协议。
问:TCP和UDP有什么区别:
答:
1) TCP协议:属于可靠的连接,在发送数据报之前建立连接,采用三次握手原则,可以保证数据能够完整的传输到目的地,因而传输速度也会比较慢。
2) UDP协议:属于不可靠的连接,发送数据包之前不会建立连接,不会保证数据报到没到达目的地。
(1)UDP:
a、将数据及源和目的封装成数据包,不需要建立连接
b、每个数据包的大小限制在64K内
c、因无连接,是不可靠协议
d、不需要建立连接,速度快
(2)TCP:
a、建立连接,形成传输数据的通道
b、在连接中进行大数据量传输
c、通过三次握手完成连接,是可靠协议
d、必须建立连接,效率会稍低
TCP程序
在Java中TCP程序的实现:
|- 使用ServerSocket类来代表服务器端,public class ServerSocket extends Object
。
|- 使用Socket类来代表客户端,public class Socket extends Object。
2、UDP传输
(1)DatagramSocket,建立发送端send(DatagramPacket p)、接收端receive(DatagramPacket p)
(2)DatagramPacket,数据报包用来实现无连接包投递服务,构造函数有DatagramPacket(byte[] buf,int length,InetAddress address,int port)等
(3)通信实现(发送端):
a、建立udpsocket服务,例如DatagramSocket ds = new DatagramSocket()对象
b、提供数据,并将数据封装到数据包中,即将数据转换成字节数组,再使用DatagramPacket进行封装,例如byte[] buf = "udp is sending".getByte();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByname("192.168.0.100"),10000)
c、通过socket服务的发送功能,将数据包发出去,ds.send(dp);
d、关闭资源,例如ds.close();
(4)通信实现(接收端):
a、建立udpSocket服务,例如 DatagramSocket ds = new DatagramSocket(10000);
b、建立一个数据包,因为接收到的是一个字节数据,数据包对象中有更多的功能用于提取字节数据的信息,例如 byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);
c、通过socket服务的接收方法将收到的数据获取到DatagramPacket中,ds.receive(dp);
d、通过DatagramPacket的功能将数据流解读出来,并输出到需要的地方,例如,String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());
e、关闭资源,ds.close();
3、TCP传输
(1)Socket建立客户端,SeverSocket建立服务器端
(2)建立连接后,通过Socket中的IO流进行数据传输
(3)关闭Socket
(4)通信实现(客户端):
a、建立socket服务,tcp是面向连接的,在建立socket服务时就要指定要连接的主机和端口以建立连接,例如Socket soc = new Socket("192.168.0.100",10003);
b、建立用于获取或写入socket输入输出流的IO流对象,例如OutputStream out = s.getOutputStream;InputStream in = new InputStream();
c、向输出流写入数据,数据即可从socket输出流输出,out.write("tcpmsg is sending".getByte());使用输入流读取即可获取socket输入流的数据,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
d、关闭资源,soc.close();
(5)通信实现(服务端):
a、建立SeverSocket服务,并监听一个端口,SeverSocket ss = newSeverSocket(10003);
b、通过accept方法获取连接过来的客户端对象,Socket s = ss.accept();
c、客户端如果发来数据,服务端使用上一步获取的对应客户端对象读取数据,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
d、关闭客户端,释放资源,s.close()
e、关闭服务端,(如果还要等待下一个客户端连接的话,也可以不关闭服务端),ss.close();
TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器端是两个独立的应用程序。
基本思路(客户端)
客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异 常。
连接成功,说明客户端与服务端建立了通道,那么 通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过 getInputStream(),getOutputStream()获取即可。
与服务端通讯结束后,关闭Socket。
通过Socket建立对象并指定要连接的服务端主机以及端口。
Socket s = new Socket(“192.168.1.1”,9999);
OutputStream out = s.getOutputStream();
out.write(“hello”.getBytes());
s.close();
基本思路(服务端)
服务端需要明确它要处理的数据是从哪个 端口进入的。
当有客户端访问时,要明确是哪个客户 端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
当该客户端访问结束,关闭该客户端。
建立服务端需要监听一个端口
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept ();
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int num = in.read(buf);
String str = new String(buf,0,num);
System.out.println(s.getInetAddress().toString()+”:”+str);
s.close();
ss.close();