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 }

 

你可能感兴趣的:(TCP)