java第二十五节-多线程socket通信

来源:互联网 发布:手机淘宝么注册网店 编辑:程序博客网 时间:2024/06/08 03:41
多线程服务器
应用多线程来实现服务器与多客户端之间的通信基本步骤
1、服务器端创建Serversocket,循环使用accept()等待客户端连接
2、客户端创建一个socket并请求和服务器端服务器连接
3、服务器端接受客户端请求,创建socket与该客户建立专线连接
4、建立连接的两个socket在一个单独的线程上对话

5、服务器端继续等待新的链接


客户端

package com.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import org.omg.CORBA.portable.InputStream;import org.omg.CORBA.portable.OutputStream;/* * 客户端 * 服务器端要先驱动 * */public class Click {public static void main(String[] args) {try {//创建客户端Socket,指定服务器地址和端口Socket socket = new Socket("localhost",8877);java.io.OutputStream os = socket.getOutputStream();//字节流输出PrintWriter pw = new PrintWriter(os);//将输出流包装为打印pw.write("用户名:admin,密码:123456");pw.flush();socket.shutdownOutput();//获取输入流,并读取服务器端的相应信息java.io.InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String info = null;while ((info=br.readLine())!=null){System.out.println("服务端说:"+info);}//关闭br.close();is.close();pw.close();os.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//获取输出流,向服务器端发送信息}}



服务端

package com.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import org.omg.CORBA.portable.InputStream;import org.omg.CORBA.portable.OutputStream;/* * 服务器 * */public class Server {public static void main(String[] args) {// TODO Auto-generated method stubtry {//创建一个服务器Socket,即ServerSocket,指定绑定端口,并监听此端口ServerSocket serverSocket = new ServerSocket(8877);System.out.println("***服务器即将启动,等待客户的链接***");int count= 0;while (true){//调用accepy方法开始监听,等待客户的链接Socket socket = serverSocket.accept();//创建一个新的线程ServerThread serverThread = new ServerThread(socket);//启动线程serverThread.start();count++;System.out.println("count="+count);}//serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


线程控制类

package com.socket;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;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 ServerThread extends Thread {Socket socket = null;public ServerThread(Socket socket){this.socket=socket;}public void run(){PrintWriter pw=null;java.io.OutputStream os=null;BufferedReader br=null;InputStreamReader isr=null;java.io.InputStream is=null;try {is = socket.getInputStream();    isr = new InputStreamReader(is);//将字节流转换成字符流    br = new BufferedReader(isr);    String info = null;    while ((info=br.readLine())!=null){     System.out.println("客户端说:"+info);    }    socket.shutdownInput();    //获取输出流,相应客户端的请求    os =  socket.getOutputStream();    pw = new PrintWriter(os);//包装为打印流    pw.write("欢迎你!");    pw.flush();//调用flush()方法将缓冲输出    pw.close();    os.close();    is.close();    isr.close();    br.close();    socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


0 0
原创粉丝点击