Java中的多线程Socket

本文介绍如何使用Java实现TCP网络编程,包括服务端和客户端的代码实现,通过客户端向服务端发送字符串,服务端接收到消息并返回确认信息。
 程序分两部分,服务端和客户端。先把服务端运行起来,在运行客户端。整个过程就是客户端想服务端发送String,服务端再返回。客户端的String由键盘输入得到。

服务器端。
Java代码 复制代码 收藏代码27182216_A4aE.gif
  1. package net.tcp;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. public class Server extends Thread
  9. {
  10. ServerSocket server = null;
  11. Socket sk = null;
  12. BufferedReader rdr = null;
  13. PrintWriter wtr = null;
  14. public Server()
  15. {
  16. try
  17. {
  18. server = new ServerSocket(1987);
  19. }
  20. catch (IOException e)
  21. {
  22. e.printStackTrace();
  23. }
  24. }
  25. public void run()
  26. {
  27. while (true)
  28. {
  29. System.out.println("Listenning...");
  30. try
  31. {
  32. // 每个请求交给一个线程去处理
  33. sk = server.accept();
  34. ServerThread th = new ServerThread(sk);
  35. th.start();
  36. sleep(1000);
  37. }
  38. catch (Exception e)
  39. {
  40. e.printStackTrace();
  41. }
  42. }
  43. }
  44. public static void main(String [] args)
  45. {
  46. new Server().start();
  47. }
  48. class ServerThread extends Thread
  49. {
  50. Socket sk = null;
  51. public ServerThread(Socket sk)
  52. {
  53. this.sk = sk;
  54. }
  55. public void run()
  56. {
  57. try
  58. {
  59. wtr = new PrintWriter(sk.getOutputStream());
  60. rdr = new BufferedReader(new InputStreamReader(sk
  61. .getInputStream()));
  62. String line = rdr.readLine();
  63. System.out.println("从客户端来的信息:" + line);
  64. // 特别,下面这句得加上 “\n”,
  65. wtr.println("你好,服务器已经收到您的信息!'" + line + "'\n");
  66. wtr.flush();
  67. System.out.println("已经返回给客户端!");
  68. }
  69. catch (IOException e)
  70. {
  71. e.printStackTrace();
  72. }
  73. }
  74. }
  75. }
package net.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread
{

	ServerSocket server = null;
	Socket sk = null;
	BufferedReader rdr = null;
	PrintWriter wtr = null;

	public Server()
	{
		try
		{
			server = new ServerSocket(1987);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public void run()
	{

		while (true)
			{
				System.out.println("Listenning...");
				try
                {
//					每个请求交给一个线程去处理
	                sk = server.accept();
	                ServerThread th = new ServerThread(sk);
	                th.start();
					sleep(1000);
                }
                catch (Exception e)
                {
	                e.printStackTrace();
                }
				
			}
	}

	public static void main(String [] args)
	{
		new Server().start();
	}

	
	
	
	
	
	class ServerThread extends Thread
	{

		Socket sk = null;
		public ServerThread(Socket sk)
		{
			this.sk = sk;
		}
		public void run()
		{
			try
            {
	            wtr = new PrintWriter(sk.getOutputStream());
	            rdr = new BufferedReader(new InputStreamReader(sk
				        .getInputStream()));
				String line = rdr.readLine();
				System.out.println("从客户端来的信息:" + line);
//				特别,下面这句得加上     “\n”,
				wtr.println("你好,服务器已经收到您的信息!'" + line + "'\n");
				wtr.flush();
				System.out.println("已经返回给客户端!");
            }
            catch (IOException e)
            {
	            e.printStackTrace();
            }
			
		}
		
	}

}


客户端:
Java代码 复制代码 收藏代码27182216_A4aE.gif
  1. package net.tcp;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintWriter;
  7. import java.net.Socket;
  8. public class Client extends Thread
  9. {
  10. Socket sk = null;
  11. BufferedReader reader = null;
  12. PrintWriter wtr = null;
  13. BufferedReader keyin = null;
  14. public Client()
  15. {
  16. keyin = new BufferedReader(new InputStreamReader(System.in));
  17. try
  18. {
  19. sk = new Socket("127.0.0.1", 1987);
  20. }
  21. catch (Exception e)
  22. {
  23. e.printStackTrace();
  24. }
  25. }
  26. public void run()
  27. {
  28. try
  29. {
  30. reader = new BufferedReader(new InputStreamReader(sk
  31. .getInputStream()));
  32. wtr = new PrintWriter(sk.getOutputStream());
  33. String get = keyin.readLine();
  34. while (true)
  35. {
  36. if (get != null & get.length() > 0)
  37. {
  38. wtr.println(get);
  39. wtr.flush();
  40. // wtr.close();
  41. // System.out.println(get + "发送完毕");
  42. }
  43. if (reader != null)
  44. {
  45. String line = reader.readLine();
  46. System.out.println("从服务器来的信息:" + line);
  47. }
  48. }
  49. }
  50. catch (Exception e)
  51. {
  52. e.printStackTrace();
  53. }
  54. }
  55. public static void main(String [] args)
  56. {
  57. new Client().start();
  58. }
  59. }

////////

1.服务端
package sterning;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net. * ;
import java.util.concurrent. * ;

public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小

public MultiThreadServer() throws IOException{
serverSocket
=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println(
"服务器启动");
}


public void service(){
while(true){
Socket socket
=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(
new Handler(socket));

}
catch (Exception e) {
e.printStackTrace();
}

}

}


public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}


}


class Handler implements Runnable {
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}

private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut
=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}

private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn
=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}

public String echo(String msg){
return "echo:"+msg;
}

public void run(){
try {
System.out.println(
"New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br
=getReader(socket);
PrintWriter pw
=getWriter(socket);
String msg
=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println(echo(msg));
if(msg.equals("bye"))
break;
}

}
catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if(socket!=null)
socket.close();
}
catch (IOException e) {
e.printStackTrace();
}

}

}

}

2.客户端
package sterning;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadClient {

public static void main(String[] args) {
int numTasks = 10;

ExecutorService exec
= Executors.newCachedThreadPool();

for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}


}


// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port=8821;

public void run() {
System.out.println(
"Task " + taskID + ":start");
try {
socket
= new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write(
"shutdown\r\n".getBytes());

// 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg
= null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
}
catch (IOException e) {
e.printStackTrace();
}

}


}
;
}

}

 

转载于:https://my.oschina.net/u/1398304/blog/337837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值