TCP传输
Socket和ServerSocket
建立客户端和服务器
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器是两个独立的应用程序
TCP协议发送和接收数据的思路图解:
TCP传输-客户端思路
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
代码体现:
1 /* 2 TCP客户端: 3 A:创建发送端的Socket对象,寻找到相对应的IP和端口以后,连接就建立成功 4 Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 5 B:创建输出流对象发送数据 6 C:创建输入流对象接收数据 7 D:释放资源 8 9 连接被拒绝。TCP协议一定要先启动服务器端,再开客户端 10 java.net.ConnectException: Connection refused: connect 11 */ 12 public class ClientDemo { 13 public static void main(String[] args) throws IOException, IOException { 14 15 //A:创建发送端的Socket对象 16 //Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 17 Socket s = new Socket("172.19.xx.xx",10010); 18 19 //B:创建输出流对象发送数据 20 OutputStream os = s.getOutputStream(); 21 os.write("我来拉!!".getBytes()); 22 23 //C:创建输入流对象接收数据 24 InputStream is = s.getInputStream(); 25 byte[] bys = new byte[1024]; 26 int len = is.read(bys);//阻塞式 27 String str = new String(bys,0,len); 28 System.out.println(str); 29 30 //释放资源 31 s.close(); 32 33 } 34 }
TCP传输—服务端思路
1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
代码体现:
1 /* 2 TCP服务器端: 3 A:创建服务端对象ServerSocket,监听窗口 4 B:通过accept方法返回一个Socket对象 5 // public Socket accept() 6 C:获取Socket的输入流,读取客户端发来的数据,并打印到控制台 7 D:创建输出流发送数据 8 E:释放资源 9 */ 10 11 public class ServerDemo { 12 13 public static void main(String[] args) throws IOException { 14 15 // A:创建服务端对象ServerSocket,监听窗口 16 ServerSocket ss = new ServerSocket(10010); 17 18 // B:通过accept方法返回一个Socket对象 19 // public Socket accept() 20 Socket s = ss.accept();//阻塞式,等待客户端的连接 21 22 // C:获取Socket的输入流,读取客户端发来的数据,并打印到控制台 23 // public InputStream getInputStream() 返回此套接字的输入流 24 InputStream is = s.getInputStream(); 25 26 // 读取数据 27 byte[] bys = new byte[1024]; 28 int len = is.read(bys);// 阻塞式,等待客户端传输数据 29 // InputStrem : public int read() 30 // 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。 31 // 如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。 32 String str = new String(bys, 0, len); 33 34 // 获取客户端的名称 35 // 获取客户端的地址对象,再获取名称 36 String name = s.getInetAddress().getHostName(); 37 38 //打印数据到控制台 39 System.out.println("从"+name+"发送: "+str); 40 41 // D:创建输出流发送数据 42 OutputStream os = s.getOutputStream(); 43 os.write("数据已收到".getBytes()); 44 45 // E:释放资源 46 s.close();// 释放客户端的资源 47 // ss.close(); 这个不能释放,因为一释放,服务器就关闭了。 48 49 50 } 51 }