黑马程序员_网络编程

网络编程的实现方式

网络编程有两种实现方式:即通过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();

原文地址:https://www.cnblogs.com/yaochao/p/3983293.html