多线程Socket例子
文章链接:http://javasam.iteye.com/blog/1484307
文章链接:http://caihx.iteye.com/blog/605186
文章链接:http://caihx.iteye.com/blog/605191
?
package com.googlecode.garbagecan.test.socket.MutlipThread;import java.io.*;import java.net.*;public class ConnectionHandler implements Runnable {protected Socket socketToHandle;public ConnectionHandler(Socket aSocketToHandle) {socketToHandle = aSocketToHandle;}public void run() {try {PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));String fileToRead = streamReader.readLine();BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));String line = null;while ((line = fileReader.readLine()) != null)streamWriter.println(line);fileReader.close();streamWriter.close();streamReader.close();} catch (Exception e) {System.out.println("Error handling a client: " + e);}}}package com.googlecode.garbagecan.test.socket.MutlipThread;import java.io.*;import java.net.*;public class MultithreadedRemoteFileServer {protected int listenPort;public MultithreadedRemoteFileServer(int aListenPort) {listenPort = aListenPort;}public void acceptConnections() {try {ServerSocket server = new ServerSocket(listenPort, 5);Socket incomingConnection = null;while (true) {incomingConnection = server.accept();handleConnection(incomingConnection);}} catch (BindException e) {System.out.println("Unable to bind to port " + listenPort);} catch (IOException e) {System.out.println("Unable to instantiate a ServerSocket on port: "+ listenPort);}}public void handleConnection(Socket connectionToHandle) {new Thread(new ConnectionHandler(connectionToHandle)).start();}public static void main(String[] args) {MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(3000);server.acceptConnections();}}package com.googlecode.garbagecan.test.socket.MutlipThread;import java.net.Socket;import sun.jdbc.odbc.ee.ConnectionHandler;/** * 这里我们将讨论 handleConnection() 方法的结构,这个方法生成一个新的 Thread 来处理每个连接。 * 我们将分两部分讨论这个问题。 * 这一屏我们将着重该方法本身,然后在下一屏研究该方法所使用的 ConnectionHandler 助手类的结构。 * * */public class RemoteFileServer {public void handleConnection(Socket connectionToHandle) { // new Thread(new ConnectionHandler(connectionToHandle)).start();}}package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;public class MyClient {public static void main(String[] args) throws Exception {Socket socket = new Socket("localhost", 10000);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter out = new PrintWriter(socket.getOutputStream());BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));while (true) {String msg = reader.readLine();out.println(msg);out.flush();if (msg.equals("bye")) {break;}System.out.println(in.readLine());}socket.close();}}package com.googlecode.garbagecan.test.socket.sample2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 上一篇文章中的例子有一个问题就是Server只能接受一个Client请求, * 当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动, * 当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求, * 这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。 * @author Administrator * */public class MyServer {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(10000);while (true) {Socket socket = server.accept();invoke(socket);}}private static void invoke(final Socket client) throws IOException {new Thread(new Runnable() {public void run() {BufferedReader in = null;PrintWriter out = null;try {in = new BufferedReader(new InputStreamReader(client.getInputStream()));out = new PrintWriter(client.getOutputStream());while (true) {String msg = in.readLine();System.out.println(msg);out.println("Server received " + msg);out.flush();if (msg.equals("bye")) {break;}}} catch(IOException ex) {ex.printStackTrace();} finally {try {in.close();} catch (Exception e) {}try {out.close();} catch (Exception e) {}try {client.close();} catch (Exception e) {}}}}).start();}}