多线程Socket实用例子

/**服务端**/

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

public class ThreadServer extends Thread {

	private Socket server;
	private BufferedReader reader;
	private PrintWriter writer;

	public ThreadServer(Socket socket) throws IOException {
		server = socket;
		reader = new BufferedReader(new InputStreamReader(
				server.getInputStream()));//创建输入流
		writer = new PrintWriter(new OutputStreamWriter(
				server.getOutputStream()));//创建输出流
		start();
	}

	public void run() {
		try {
			while (true) {
				String str = reader.readLine();//读取客户端传来的请求
				if (str.equals("END"))
					break;
				System.out.println("Echoing:" + str);
				writer.println(str);//打印请求信息
			}
		} catch (IOException e) {
		} finally {
			try {
				server.close();
			} catch (IOException e) {
			}
		}
	}

        /**main启动服务器**/
	static final int PORT = 8080;
	public static void main(String[] args)  throws IOException{
		ServerSocket server  = new ServerSocket(PORT);//启动服务器
		System.out.println("Server Started:" + server);
		try{
			while(true){
				Socket socket = server.accept();//进入阻塞状态准备接收数据
				try {
					new ThreadServer(socket);//创建服务线程
				} catch (IOException e) {
					socket.close();
				}
			}
		}finally{
			server.close();
		}
	}
}
/**客户端**/
package com.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;


public class ThreadClient extends Thread {

	private Socket client;//客户端套接字(浏览器等等)
	private BufferedReader reader;//输入流
	private PrintWriter writer;//输出流
	private static int counter = 0;//请求数量
	private int id = counter++;//请求id
	private static int threadcount = 0;//线程数量

	public  static int getThreadCount() {
		return threadcount;
	}
	public ThreadClient(InetAddress address){
		System.out.println("Making client" + id);
		threadcount ++;
		try{
			client = new Socket(address,MultiJobServer.PORT);//发送请求到指定地址+端口
		}catch (IOException e) {
		}
		
		try {
			reader = new BufferedReader(new InputStreamReader(client.getInputStream()));//初始化输入流
			writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream()),true);//初始化输出流
			start();//开始线程
		} catch (IOException e) {
			try {
				client.close();
			} catch (IOException e2) {
			}
		}
	}
	public void run(){
		try {
			for(int i = 0 ; i < 25 ; i ++){
				writer.println("Client " + id + ":" + i);//发送请求信息
				String str = reader.readLine();//接收返回的信息
				System.out.println(str);//打印返回数据
			}
			writer.println("END");
		} catch (Exception e) {
		}finally{
			try {
				client.close();
			} catch (IOException e) {
			}
			threadcount --;
		}
	}

	static final int MAX_THREADS = 4000;//最大线程数
	@SuppressWarnings("static-access")
	public static void main(String[] args) throws UnknownHostException, InterruptedException {
		InetAddress address = InetAddress.getByName(null);//得到本机地址
		while(true){
			if(ThreadClient.getThreadCount() < MAX_THREADS){
				new ThreadClient(address);//发送请求
				Thread.currentThread().sleep(100);//休眠100毫秒后继续请求
			}
		}
	}
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值