JAVA SOCKET网络编程,服务端接收多个客户端连接的实现

这是基于前面一篇文章的一个简单扩展,当然这不是最好的实现


服务端如果要想接收多个客户端连接,必须死循环去接收新的客户端的连接请求,一个完整的客户端服务端socket连接通过一个线程来维护

package com.tree.demo.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class ThreadServerSocket implements Runnable {

	private Socket server;
	
	public ThreadServerSocket(Socket i) {
		// TODO Auto-generated constructor stub
		server = i;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			InputStream in = server.getInputStream();
			OutputStream out = server.getOutputStream();
			Scanner sc = new Scanner(in);
			PrintWriter pw = new PrintWriter(out,true/*autoFlush*/);
			pw.println("Hello ! Enter BYE to Exit.");
			while(sc.hasNextLine()) {
				String line = sc.nextLine();
				pw.println("Echo:"+line);
				if(line.trim().equals("BYE")) {
					break;
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
}

public class MulServerSocketDemo {

	private static final int PORT = 1234;
	
	//private static final int BUFFER_SIZE = 1024;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 1;
		ServerSocket ss = new ServerSocket(PORT);
		while(true) {
			Socket s = ss.accept();
			System.out.println("第 "+(counter++)+" 个连接");
			Thread t = new Thread(new ThreadServerSocket(s));
			t.start();
		}
	}

}
启动以上程序之后,通过命令行,telnet命令来试验下

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现_第1张图片

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现_第2张图片


同时开了6个连接,当然也可以通过JAVA来是实现:

服务端:

package com.tree.demo.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

class ThreadServerSocket implements Runnable {

	private Socket server;
	
	private int BUFFER_SIZE = 1024;
	
	public ThreadServerSocket(Socket i) {
		// TODO Auto-generated constructor stub
		server = i;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			InputStream in = server.getInputStream();
			OutputStream out = server.getOutputStream();
			byte[] recData = null;
			while(true) {
				recData = new byte[BUFFER_SIZE];
				int r = in.read(recData);
				//int r = in.read(recData);
				if(r>-1) {
					String data = new String(recData);
					if(data.trim().equals("over")) {
						server.close();
						break;
					}
					System.out.println("读取到客户端发送的来数据:"+data);
					out.write("这是服务端发给客户端的数据:".getBytes());
					out.write(recData);
				}else {
					System.out.println("数据读取完毕!");
					server.close();
					break;
					//ss.close();
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
}

public class MulServerSocketDemo {

	private static final int PORT = 1234;
	
	//private static final int BUFFER_SIZE = 1024;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 1;
		ServerSocket ss = new ServerSocket(PORT);
		while(true) {
			Socket s = ss.accept();
			System.out.println("第 "+(counter++)+" 个连接");
			Thread t = new Thread(new ThreadServerSocket(s));
			t.start();
		}
	}

}
客户端:

package socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

class ThreadClientSocket implements Runnable {

	private static final String HOST = "192.168.8.17";

	private static final int PORT = 1234;
	
	private Socket client;

	public ThreadClientSocket() {
		client = new Socket();
		try {
			client.connect(new InetSocketAddress(HOST, PORT), 500);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			OutputStream out = client.getOutputStream();
			int counter = 0;
			while (true) {
				System.out.println("Thread-->"+Thread.currentThread().getName());
				out.write("Heart Beat !".getBytes());
				System.out.println(client + "================" + (counter++));
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

public class MulClientSocketDemo {


	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		int counter = 4;
		while((counter--)>0) {
			new Thread(new ThreadClientSocket()).start();;
		}
		// client.setTcpNoDelay(true);
	}

}

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现_第3张图片

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现_第4张图片


该实现仍然有很多不足,更好的实现可通过通道来实现,未完待续..........



JAVA SOCKET网络编程,服务端接收多个客户端连接的实现_第5张图片

你可能感兴趣的:(Java)