多线程_TCP编程

Posted superdrew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程_TCP编程相关的知识,希望对你有一定的参考价值。

java源码示例展示:

服务端:

 1 package tcp2;
 2 
 3 import java.io.IOException;
 4 import java.net.InetAddress;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 /**
 9  * 登录的服务器
10  * @author superdrew 
11  *     TCP 登录 
12  *    功能:用户在客户端输入用户名和密码提交给服务器,服务器接收并处理,处理完后给客户端一个返回信息
13  *        客户端接口服务器的反馈消息并输出
14  *    缺点:服务器处理一次用户请求之后,就关闭了
15  *            应该是服务器一直监听,可以处理多个用户的请求
16  *        使用while循环类似达到效果,但是不可以
17  *        不是并行,是串行的。请求一次,只能等待该次请求执行完毕
18  *        
19  *        问题:学生1-------咨询1     学生2---------咨询1 学    生3------------咨询1
20  *        
21  *        解决:
22  *        学生1------------        ---------------咨询1            
23  *        学生2    ------------ 前台接待  ---------------咨询2
24  *        学生3------------       ----------------咨询3
25  *      
26  *      使用线程来处理
27  */
28 public class LoginServer {
29     public static void main(String[] args) throws IOException {
30         //1.创建一个serversocket  创建服务
31         @SuppressWarnings("resource")
32         ServerSocket serverSocket = new ServerSocket(8888);//端口 8888  IP地址是本机
33         int i =1;
34         while(true){
35             Socket socket = serverSocket.accept();
36             InetAddress ia = socket.getInetAddress();
37             new LoginThread(socket).start();
38             System.out.println("第"+ i++ +"个人来访问,访问者ip是:"+ia.getHostAddress());
39         }
40     }
41 }
LoginServer.java

客户端:

 1 package tcp2;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import java.io.OutputStream;
 7 import java.net.InetAddress;
 8 import java.net.Socket;
 9 import java.net.UnknownHostException;
10 import java.util.Scanner;
11 
12 /**
13  * 登录的客户端
14  * @author superdrew
15  *
16  */
17 public class LoginClient {
18     public static void main(String[] args) throws UnknownHostException, IOException {
19         //1.创建一个socket  连接服务器
20         Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//必须要知道服务器IP和端口号
21         @SuppressWarnings("resource")
22         Scanner sc = new Scanner(System.in);
23         //2.通过 socket 发送数据给服务器
24         //OutputStream os = new FileOutputStream("d:/b.txt");输出到文件
25         System.out.println("请输入登入信息:");
26         String info = sc.nextLine();
27         OutputStream os = socket.getOutputStream();
28         DataOutputStream dos = new DataOutputStream(os);
29         dos.writeUTF(info);
30         //3.接收服务器返回的消息
31         DataInputStream dis = new DataInputStream(socket.getInputStream());
32         String result = dis.readUTF();
33         System.out.println("服务器返回的消息response:"+result);
34         
35         //4.关闭资源
36         dis.close();
37         dos.close();
38         socket.close();
39     }
40 }
LoginClient.java

多人登入的线程:

 1 package cn.com.sxt.tcp2;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.IOException;
 6 import java.io.InputStream;
 7 import java.net.Socket;
 8 
 9 /**
10  * 登录线程
11  * @author superdrew
12  *
13  */
14 public class LoginThread extends Thread{
15     private Socket socket;
16     
17     public void setSocket(Socket socket){
18         this.socket = socket;
19     }
20     
21     public LoginThread(Socket socket){
22         this.socket = socket;
23     }
24     
25     public void run() {
26         InputStream is;
27         DataOutputStream dos = null;
28         DataInputStream dis = null;
29         
30         try {
31             is = socket.getInputStream();
32             dis = new DataInputStream(is);
33             String result = dis.readUTF();
34             System.out.println("客户端发送来的消息:"+result);
35             //4.给客户端反馈一个消息 
36             dos = new DataOutputStream(socket.getOutputStream());
37             if("superdrew".equals(result)){
38                 dos.writeUTF("登录成功");
39             }else{
40                 dos.writeUTF("登录失败");
41             }
42         } catch (IOException e) {
43             e.printStackTrace();
44         }finally{
45             try {
46                 if(dos!=null){
47                     dos.close();//关闭dos
48                 }
49             } catch (IOException e) {
50                 e.printStackTrace();
51             }
52             try {
53                 if(dis!=null){
54                     dis.close();//关闭dis
55                 }
56             } catch (IOException e) {
57                 e.printStackTrace();
58             }
59             try {
60                 if(socket!=null){
61                     socket.close();//关闭socket
62                 }
63             } catch (IOException e) {
64                 e.printStackTrace();
65             }
66         }
67         
68     }
69 }
LoginThread.java

操作步骤:

①运行服务端;②运行客户端;③输入登入信息为superdrew;④在console窗口下点击,可以看到这是第几次登入以及相关记录的信息;

结果展示---如图:

 

以上是关于多线程_TCP编程的主要内容,如果未能解决你的问题,请参考以下文章

Linux-TCP编程流程-Socket编程-单线程实现TCP客户端和服务端交互-多进程实现TCP客户端和服务端交互

Linux网络编程必学!——Linux_网络编程_TCP

Linux网络编程必学!——Linux_网络编程_TCP

多线程编程

多线程编程

多线程编程以及socket编程_Linux程序设计4chapter15