网络编程之TCP

时间:2022-12-13 17:57:21

TCP通信

TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。

JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端

通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。

 

 ServerSocket类:该类的实例对象可以实现一个服务器段的程序。

 

  ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

 

  

 Socket 类:  实现TCP客户端程序。

 

Socket类的常用方法中,getInputStream()getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。

 

 

要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序。

 1 package udpdemo;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8 
 9 
10 public class TCPClient {
11     private static int port=9999;
12     private static String ip="127.0.0.1";
13     
14     
15     public static void main(String[] args) throws IOException, IOException {
16          byte[] bytes = new byte[1024];
17          int len=0;
18          int l=0;
19          byte[] b= new byte[1024];
20         //创建客户端Socket,指定要连接的端口和ip;
21         Socket socket = new Socket(ip,port);
22     
23         /**
24          * 读取本地文件("E:\\1\\tx.jpg")
25          * 向服务器上传文件
26          */
27         FileInputStream fis = new FileInputStream("E:\\1\\tx.jpg");
28         OutputStream out = socket.getOutputStream();
29         
30         while((l=fis.read(b))!=-1) {
31             out.write(b,0,l);
32         }
33         
34         System.out.println("文件发送成功....");
35         socket.shutdownOutput();//不加这句,上传的文件无法使用,还在被服务器占用,
36                                     //shutdownOutput()发送消息告诉服务器,传送完毕,可以释放资源了
37         
38         
39         /**
40          * 读取服务器的反馈信息
41          */
42         //创建一个保存信息的字节数组
43         //获取输入流
44         InputStream in = socket.getInputStream();
45         while((len=in.read(bytes))!=-1) {
46             System.out.println(new String(bytes,0,len));
47         }
48         fis.close();
49         in.close();
50         socket.close();
51     }
52 }
/**************************************输出结果***************************************/
文件发送成功....
恭喜,连接服务器成功...

 

 

 1 package udpdemo;
 2 
 3 import java.io.BufferedOutputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.io.OutputStream;
 8 import java.net.InetAddress;
 9 import java.net.ServerSocket;
10 import java.net.Socket;
11 
12 /**
13  * TCP通信     服务器端
14  * ServerSocket
15  * 
16  *
17  */
18 public class TCPServer {
19     public static void main(String[] args) throws IOException {
20         //创建服务器对象,指定服务器端口号(9999)
21         ServerSocket server=new ServerSocket(9999);
22         //accept()开启服务器,等待客户端连接,连接后返回一个客户端Socket对象
23         Socket socket = server.accept();
24         //获取客户端连接对象
25         InetAddress  ipObject=socket.getInetAddress();
26 //        显示哪个ip连接了服务器
27         System.out.println("客户端:"+ipObject.getHostAddress()+"连接上了服务器");
28         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\a\\a.jpg"));
29         /**
30          * 通过客户端socket对象获得输入流,从而可以实现读取数据,通过accept()方法获取正在连接服务器的客户端的对象,
31          * 调用客户端对象的输入流去读取客户端输出的数据,
32          * 
33          */
34         InputStream in = socket.getInputStream();
35         //输入流循序读取客户端传来的数据,并通过输出流写入文件,实现上传功能
36         byte[] bytes = new byte[1024];
37         int len =0;
38         while((len=in.read(bytes))!=-1) {
39             bos.write(bytes,0,len);
40         }
41         System.out.println("文件上传成功...");
42         /*
43          *     服务器的反馈信息
44          */
45         //通过Socket对象,拿到getOutputStream(),获取输出流,回复客户端"连接服务器成功"
46             OutputStream out=socket.getOutputStream();
47             out.write("恭喜,连接服务器成功...".getBytes());
48         //关闭流资源
49             bos.close();
50             out.close();
51             socket.close();
52     }
53 }
/****************************************输出结果***************************************/
客户端:127.0.0.1连接上了服务器
文件上传成功...