TCP

一、Socket是什么:

Socket是连接运行在网络上的两个程序间的双向通讯的端点。

为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。

二、使用Socket进行网络通信的过程:

1.服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

2.客户程序根据服务器程序所在的主机名和端口号发出连接请求。

3.如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

4.客户和服务器通过读、写套接字进行通讯。

三、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信总结:

1.建立Socket连接

2. 获得输入/输出流

3.读/写数据

4.关闭输入/输出流

5. 关闭Socket

Server端

 1 import java.net.ServerSocket;
 2 import java.net.Socket;
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.io.OutputStreamWriter;
 9 import java.io.PrintWriter;
10 
11 /*
12  * 基于TCP协议的Socket通信,实现用户登陆
13  * 服务器端
14  */
15 public class Server {
16     public static void main(String[] args) {
17         try {
18             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
19             ServerSocket serverSocket = new ServerSocket(8888);
20             Socket socket = null;
21             System.out.println("服务器启动");
22 
23             // 监听等待客户端的连接
24             socket = serverSocket.accept();
25 
26             InputStream is = socket.getInputStream();
27             InputStreamReader isr = new InputStreamReader(is);
28             BufferedReader br= new BufferedReader(isr);
29 
30             String a;
31             while ((a = br.readLine()) != null) {
32                 System.out.println("用户信息:" + a);
33             }
34             
35             OutputStream os = socket.getOutputStream();
36             OutputStreamWriter osw=new OutputStreamWriter(os);
37             //osw.write("asd");
38             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
39             pw.write("welcome");
40             pw.flush();
41             
42             osw.close();
43             os.close();
44             br.close();
45             isr.close();
46             is.close();
47             
48             socket.close();
49             serverSocket.close();
50             
51         } catch (IOException e) {
52             e.printStackTrace();
53         }
54     }
55 }
View Code

Client端

 1  package test_1;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.io.PrintWriter;
 9 import java.net.Socket;
10 import java.net.UnknownHostException;
11 
12 /*
13  * 客户端
14  */
15 public class Client {
16     public static void main(String[] args) {
17         try {
18             //创建客户端Socket,指定服务器地址和端口
19             Socket socket=new Socket("localhost", 8888);
20             //获取输出流,向服务器端发送信息
21             OutputStream os=socket.getOutputStream();//字节输出流
22             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
23             pw.write("用户名:alice;密码:789");
24             pw.flush();
25             socket.shutdownOutput();//关闭输出流
26             //获取输入流,并读取服务器端的响应信息
27             InputStream is=socket.getInputStream();
28             BufferedReader br=new BufferedReader(new InputStreamReader(is));
29             String info=null;
30             while((info=br.readLine())!=null){
31                 System.out.println("我是客户端,服务器说:"+info);
32             }
33             //4.关闭资源
34             br.close();
35             is.close();
36             pw.close();
37             os.close();
38             socket.close();
39         } catch (UnknownHostException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 }
View Code

 多线程的Server端:

 1 package test_1;
 2 
 3 import java.net.InetAddress;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 import java.io.IOException;
 7 
 8 /*
 9  * 基于TCP协议的Socket通信,实现用户登陆
10  * 服务器端
11  */
12 public class Server {
13     public static void main(String[] args) {
14         try {
15             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
16             ServerSocket serverSocket = new ServerSocket(8888);
17             Socket socket = null;
18             System.out.println("服务器启动");
19             
20             while(true){
21                 // 监听等待客户端的连接
22                 socket = serverSocket.accept();
23                 
24                 Serverthread serverthread=new Serverthread(socket);
25                 
26                 serverthread.start();
27                 InetAddress address=socket.getInetAddress();
28                 System.out.println("当前客户端的IP:"+address.getHostAddress());
29             }
30 
31             
32         } catch (IOException e) {
33             e.printStackTrace();
34         }
35     }
36 }
37 
38 
39 package test_1;
40 
41 import java.io.BufferedReader;
42 import java.io.IOException;
43 import java.io.InputStream;
44 import java.io.InputStreamReader;
45 import java.io.OutputStream;
46 import java.io.OutputStreamWriter;
47 import java.io.PrintWriter;
48 import java.net.Socket;
49 
50 public class Serverthread extends Thread{
51     Socket socket=null;
52     
53     public Serverthread(Socket socket) {
54         this.socket=socket;
55     }
56     
57     public void run() {
58         try {
59             InputStream is = socket.getInputStream();
60             InputStreamReader isr = new InputStreamReader(is);
61             BufferedReader br= new BufferedReader(isr);
62 
63             String a;
64             while ((a = br.readLine()) != null) {
65                 System.out.println("用户信息:" + a);
66             }
67             
68             OutputStream os = socket.getOutputStream();
69             OutputStreamWriter osw=new OutputStreamWriter(os);
70             //osw.write("asd");
71             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
72             pw.write("welcome");
73             pw.flush();
74             
75             osw.close();
76             os.close();
77             br.close();
78             isr.close();
79             is.close();
80             
81             socket.close();
82         } catch (IOException e) {
83             // TODO 自动生成的 catch 块
84             e.printStackTrace();
85         }
86         
87     };
88 }
原文地址:https://www.cnblogs.com/daneres/p/4670735.html