socket ( java ) 简单多个客户端、服务端通信(多线程)

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处  、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/love254443233/article/details/7897269


实现:

客户端:多个socket(多个端口),其中一个客户端的一个端口用于接收服务端发送过来的消息,其一个用于向服务端发送消息。其它客户端只有发消息的功能。

服务端:两个socket,一个用于循环接收客户端发送过来的socket请求。一个用于接收消息手自动向客户端发送消息。

注:先运行MySocketServer,然后MySocketClient,最后SocketClient;MySocketClient、SocketClient向MySocketServer发送消息。

1、MySocketServer类:

Java代码 复制代码  收藏代码
  1. package socket._5;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.InputStream;   
  5. import java.io.OutputStream;   
  6. import java.net.ServerSocket;   
  7. import java.net.Socket;   
  8.   
  9. public class MySocketServer {   
  10.     private static int localHostPort = 5000;   
  11.   
  12.     public static void main(String[] args) throws IOException {   
  13.         ServerSocket s = new ServerSocket(localHostPort);   
  14.         System.out.println("服务器端------监听中.....");   
  15.         while (true) {   
  16.             Socket socket = s.accept();   
  17.             System.out.println("接入的socket:" + socket);   
  18.             GetMessage getMessage = new GetMessage(socket);   
  19.             Thread thread = new Thread(getMessage);   
  20.             thread.start();   
  21.         }   
  22.     }   
  23. }   
  24.   
  25. // 接收消息   
  26. class GetMessage implements Runnable {   
  27.     private int remotePort = 5001;   
  28.     private String remoetAddress = "localhost";   
  29.     private InputStream inputStream;   
  30.     private OutputStream outputStream;   
  31.     private Socket socketGet;   
  32.     private Socket socketSendMessage;   
  33.     private boolean socketIsExits = false;   
  34.     private int sum = 0;   
  35.   
  36.     private byte[] buffer;   
  37.   
  38.     public GetMessage(Socket socket) {   
  39.         this.socketGet = socket;   
  40.         try {   
  41.             inputStream = socketGet.getInputStream();   
  42.             outputStream = socketGet.getOutputStream();   
  43.         } catch (IOException e) {   
  44.             e.printStackTrace();   
  45.         }   
  46.     }   
  47.   
  48.     public void run() {   
  49.         String str = "";   
  50.         int n = 0;   
  51.         while (true) {   
  52.             try {   
  53.                 buffer = new byte[2048];   
  54.                 n = inputStream.read(buffer);   
  55.                 str = new String(buffer, 0, n);   
  56.                 System.out.print("客户端:" + str);   
  57.                 sendMessage();   
  58.             } catch (IOException e) {   
  59.                 e.printStackTrace();   
  60.                 break;   
  61.             }   
  62.             if (str.equals("q")) {   
  63.                 break;   
  64.             }   
  65.         }   
  66.         try {   
  67.             if (socketGet != null)   
  68.                 socketGet.close();   
  69.             if (inputStream != null)   
  70.                 inputStream.close();   
  71.         } catch (Exception e) {   
  72.   
  73.         }   
  74.     }   
  75.   
  76.     // 发送消息   
  77.     public void sendMessage() throws IOException {   
  78.         if (socketIsExits) {   
  79.             try {   
  80.                 String input = "======" + (sum++);   
  81.                 System.out.println("服务端发送 socket:" + this.socketSendMessage);   
  82.                 outputStream.write(input.getBytes());   
  83.                 System.out.println("服务器:" + input);   
  84.                 outputStream.flush();   
  85.             } catch (Exception e) {   
  86.                 System.out.println("客户端socket不存在。");   
  87.                 checkSocket();   
  88.             }   
  89.         } else {   
  90.             checkSocket();   
  91.         }   
  92.     }   
  93.   
  94.     private void checkSocket() {   
  95.         try {   
  96.             socketSendMessage = new Socket(remoetAddress, remotePort);   
  97.             outputStream = socketSendMessage.getOutputStream();   
  98.             socketIsExits = true;   
  99.         } catch (Exception e) {   
  100.             socketIsExits = false;   
  101.         }   
  102.     }   
  103. }  
package socket._5;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MySocketServer {
	private static int localHostPort = 5000;

	public static void main(String[] args) throws IOException {
		ServerSocket s = new ServerSocket(localHostPort);
		System.out.println("服务器端------监听中.....");
		while (true) {
			Socket socket = s.accept();
			System.out.println("接入的socket:" + socket);
			GetMessage getMessage = new GetMessage(socket);
			Thread thread = new Thread(getMessage);
			thread.start();
		}
	}
}

// 接收消息
class GetMessage implements Runnable {
	private int remotePort = 5001;
	private String remoetAddress = "localhost";
	private InputStream inputStream;
	private OutputStream outputStream;
	private Socket socketGet;
	private Socket socketSendMessage;
	private boolean socketIsExits = false;
	private int sum = 0;

	private byte[] buffer;

	public GetMessage(Socket socket) {
		this.socketGet = socket;
		try {
			inputStream = socketGet.getInputStream();
			outputStream = socketGet.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void run() {
		String str = "";
		int n = 0;
		while (true) {
			try {
				buffer = new byte[2048];
				n = inputStream.read(buffer);
				str = new String(buffer, 0, n);
				System.out.print("客户端:" + str);
				sendMessage();
			} catch (IOException e) {
				e.printStackTrace();
				break;
			}
			if (str.equals("q")) {
				break;
			}
		}
		try {
			if (socketGet != null)
				socketGet.close();
			if (inputStream != null)
				inputStream.close();
		} catch (Exception e) {

		}
	}

	// 发送消息
	public void sendMessage() throws IOException {
		if (socketIsExits) {
			try {
				String input = "======" + (sum++);
				System.out.println("服务端发送 socket:" + this.socketSendMessage);
				outputStream.write(input.getBytes());
				System.out.println("服务器:" + input);
				outputStream.flush();
			} catch (Exception e) {
				System.out.println("客户端socket不存在。");
				checkSocket();
			}
		} else {
			checkSocket();
		}
	}

	private void checkSocket() {
		try {
			socketSendMessage = new Socket(remoetAddress, remotePort);
			outputStream = socketSendMessage.getOutputStream();
			socketIsExits = true;
		} catch (Exception e) {
			socketIsExits = false;
		}
	}
}
2、MySocketClient类:

Java代码 复制代码  收藏代码
  1. package socket._5;   
  2.   
  3. import java.io.*;   
  4. import java.net.*;   
  5.   
  6. public class MySocketClient {   
  7.     private static int localHostPort = 5001;   
  8.   
  9.     public static void main(String[] args) throws IOException {   
  10.   
  11.         CSendMessage cSendMessage = new CSendMessage();   
  12.         Thread thread2 = new Thread(cSendMessage);   
  13.         thread2.start();   
  14.   
  15.         ServerSocket serverSocket = new ServerSocket(localHostPort);   
  16.         while (true) {   
  17.             Socket socketServer = serverSocket.accept();   
  18.             CGetMessage getMessage = new CGetMessage(socketServer);   
  19.             Thread thread = new Thread(getMessage);   
  20.             thread.start();   
  21.         }   
  22.     }   
  23. }   
  24.   
  25. // 接收消息   
  26. class CGetMessage implements Runnable {   
  27.     private InputStream inputStream;   
  28.     private Socket socket;   
  29.     private byte[] buffer;   
  30.   
  31.     public CGetMessage(Socket socket) {   
  32.         this.socket = socket;   
  33.         try {   
  34.             inputStream = socket.getInputStream();   
  35.         } catch (IOException e) {   
  36.             e.printStackTrace();   
  37.         }   
  38.     }   
  39.   
  40.     public void run() {   
  41.         String str = "";   
  42.         while (true) {   
  43.             buffer = new byte[2048];   
  44.             int n = 0;   
  45.             try {   
  46.                 n = inputStream.read(buffer);   
  47.                 str = new String(buffer, 0, n);   
  48.                 System.out.println("服务器:" + str);   
  49.             } catch (IOException e) {   
  50.                 e.printStackTrace();   
  51.                 break;   
  52.             }   
  53.             if (str.equals("q")) {   
  54.                 break;   
  55.             }   
  56.         }   
  57.         try {   
  58.             if (socket != null)   
  59.                 socket.close();   
  60.             if (inputStream != null)   
  61.                 inputStream.close();   
  62.         } catch (Exception e) {   
  63.   
  64.         }   
  65.     }   
  66. }   
  67.   
  68. // 发送消息   
  69. class CSendMessage implements Runnable {   
  70.     private boolean socketIsExits = false;   
  71.     private OutputStream outputStream;   
  72.     private Socket socketClient;   
  73.     private int remotePort = 5000;   
  74.     private String remoteAddress = "localhost";   
  75.     private byte[] buffer;   
  76.   
  77.     public CSendMessage() throws IOException {   
  78.     }   
  79.   
  80.     public void run() {   
  81.         String str = new String();   
  82.         checkSocket();   
  83.         int size = 0;   
  84.         while (true) {   
  85.             try {   
  86.                 System.out.println("请输入:");   
  87.                 buffer = new byte[2048];   
  88.                 size = System.in.read(buffer);   
  89.                 str = new String(buffer, 0, size);   
  90.             } catch (IOException e) {   
  91.                 e.printStackTrace();   
  92.             }   
  93.             if (socketIsExits) {   
  94.                 try {   
  95.                     System.out.println("客户端发送 socket:" + this.socketClient);   
  96.                     System.out.print("客户端:" + str);   
  97.                     outputStream.write(str.getBytes());   
  98.                     outputStream.flush();   
  99.                 } catch (Exception e) {   
  100.                     System.out.println("客户端socket不存在。");   
  101.                     checkSocket();   
  102.                 }   
  103.             } else {   
  104.                 checkSocket();   
  105.             }   
  106.         }   
  107.     }   
  108.   
  109.     private void checkSocket() {   
  110.         try {   
  111.             socketClient = new Socket(remoteAddress, remotePort);   
  112.             outputStream = socketClient.getOutputStream();   
  113.             socketIsExits = true;   
  114.         } catch (Exception e) {   
  115.             socketIsExits = false;   
  116.         }   
  117.     }   
  118. }  
package socket._5;

import java.io.*;
import java.net.*;

public class MySocketClient {
	private static int localHostPort = 5001;

	public static void main(String[] args) throws IOException {

		CSendMessage cSendMessage = new CSendMessage();
		Thread thread2 = new Thread(cSendMessage);
		thread2.start();

		ServerSocket serverSocket = new ServerSocket(localHostPort);
		while (true) {
			Socket socketServer = serverSocket.accept();
			CGetMessage getMessage = new CGetMessage(socketServer);
			Thread thread = new Thread(getMessage);
			thread.start();
		}
	}
}

// 接收消息
class CGetMessage implements Runnable {
	private InputStream inputStream;
	private Socket socket;
	private byte[] buffer;

	public CGetMessage(Socket socket) {
		this.socket = socket;
		try {
			inputStream = socket.getInputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void run() {
		String str = "";
		while (true) {
			buffer = new byte[2048];
			int n = 0;
			try {
				n = inputStream.read(buffer);
				str = new String(buffer, 0, n);
				System.out.println("服务器:" + str);
			} catch (IOException e) {
				e.printStackTrace();
				break;
			}
			if (str.equals("q")) {
				break;
			}
		}
		try {
			if (socket != null)
				socket.close();
			if (inputStream != null)
				inputStream.close();
		} catch (Exception e) {

		}
	}
}

// 发送消息
class CSendMessage implements Runnable {
	private boolean socketIsExits = false;
	private OutputStream outputStream;
	private Socket socketClient;
	private int remotePort = 5000;
	private String remoteAddress = "localhost";
	private byte[] buffer;

	public CSendMessage() throws IOException {
	}

	public void run() {
		String str = new String();
		checkSocket();
		int size = 0;
		while (true) {
			try {
				System.out.println("请输入:");
				buffer = new byte[2048];
				size = System.in.read(buffer);
				str = new String(buffer, 0, size);
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (socketIsExits) {
				try {
					System.out.println("客户端发送 socket:" + this.socketClient);
					System.out.print("客户端:" + str);
					outputStream.write(str.getBytes());
					outputStream.flush();
				} catch (Exception e) {
					System.out.println("客户端socket不存在。");
					checkSocket();
				}
			} else {
				checkSocket();
			}
		}
	}

	private void checkSocket() {
		try {
			socketClient = new Socket(remoteAddress, remotePort);
			outputStream = socketClient.getOutputStream();
			socketIsExits = true;
		} catch (Exception e) {
			socketIsExits = false;
		}
	}
}
3、SocketClient类:

Java代码 复制代码  收藏代码
  1. package socket._5;   
  2.   
  3. import java.io.IOException;   
  4. import java.io.OutputStream;   
  5. import java.net.Socket;   
  6. import java.net.UnknownHostException;   
  7.   
  8. public class SocketClient implements Runnable {   
  9.     public int remotePort = 5000;   
  10.     public String remoteAddress = "localhost";   
  11.        
  12.        
  13.     public static void main(String args[]) {   
  14.         SocketClient socketClient = new SocketClient();   
  15.         socketClient.run();   
  16.     }   
  17.        
  18.   
  19.     public SocketClient() {   
  20.     }      
  21.        
  22.     public void run() {   
  23.         Socket socket = null;   
  24.         OutputStream outputStream = null;   
  25.         byte[] buffer;   
  26.         int size = 0;          
  27.         try {   
  28.             socket = new Socket(remoteAddress, remotePort);   
  29.             outputStream = socket.getOutputStream();   
  30.             System.out.println(socket);            
  31.             while (true) {   
  32.                 System.out.println("input:");   
  33.                 buffer = new byte[2048];   
  34.                 size = System.in.read(buffer);   
  35.                 if (size > 0) {   
  36.                     outputStream.write(new String(buffer, 0, size).getBytes());   
  37.                     outputStream.flush();   
  38.                 }   
  39.             }   
  40.         } catch (UnknownHostException e) {   
  41.             e.printStackTrace();   
  42.         } catch (IOException e) {   
  43.             e.printStackTrace();   
  44.         } finally {   
  45.             try {   
  46.                 if (socket != null)   
  47.                     socket.close();   
  48.                 if (outputStream != null)   
  49.                     outputStream.close();   
  50.             } catch (IOException e) {   
  51.                 e.printStackTrace();   
  52.             }   
  53.         }   
  54.            
  55.     }   
  56. }  

java教程下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值