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端

TCP
 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端

TCP
 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)