多线程Java Socket通信实例

seedily

贡献于2014-03-04

字数:3526 关键词: Java开发 Java

 一个简单的基于Socket通信程序。 第一步,开发Clicent端,代码如下: package com.sky.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { Socket cs = null; // 定义客户端socket对象 BufferedReader reader = null; // 定义缓冲字符输入流 BufferedReader sysReader = null;// 定义缓冲字符输入流(从键盘读去消息) PrintWriter writer = null;// 定义打印输出流 try { cs = new Socket("127.0.0.1", 9999);// 连接服务器端 // 客户端先写信息 writer = new PrintWriter(cs.getOutputStream());// 初始化缓冲字符输入流 // 初始化缓冲字符输入流(从键盘读去消息) reader = new BufferedReader(new InputStreamReader(cs.getInputStream())); // 初始化缓冲字符输出流 sysReader = new BufferedReader(new InputStreamReader(System.in)); // 从控制台得到输入信息 String info = null; // 定义存放字符消息的字符串对象 while (true) { System.out.println("Client:" + "输入您的语句:"); //从键盘读取用户输入的字符串,并去掉两边的空格 info = sysReader.readLine().trim(); //判断是否为推出的标识("exit") if ("exit".equalsIgnoreCase(info.trim())) { System.out.println("回话结束·······"); writer.println(info);// 将键盘读取到的消息写入socket管道 writer.flush(); // 刷新缓存 reader.close(); //关闭输入流 writer.close();//关闭输出流 cs.close(); //关闭socket管道 break; } writer.println(info);//将键盘读取到的消息写入socket管道 writer.flush(); //刷新缓存 System.out.println("等待服务器的响应:"); info = reader.readLine(); //读取socket管道中服务器端返回的消息 System.out.println("Server端返回的消息是:" + info); } } catch (Exception e) { System.out.println("正常断开连接"); } } } 第二步:开发监听器Listener端,代码如下: package com.sky.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Listener { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(9999);// 创建socket通信的服务端ServerSocket对象 System.out.println("服务器已启动!"); // 循环的监听是否有客户端的连接请求 while (true) { Socket client = server.accept(); // 每一个客户端都生成一个新的client引用 System.out.println("一个新的客户端连接上了"); ListenerThread lt = new ListenerThread(client); Thread thread = new Thread(lt);// 开启新的线程和客户端通信。 thread.start(); } } catch (IOException e) { System.out.println("正常断开连接"); } } } 第三步,开发和客户进行通信的线程类,代码如下: package com.sky.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ListenerThread implements Runnable { private Socket client = null; private String message = null; // 定义从socket管道接收的消息 private BufferedReader serverReader = null; private PrintWriter serverWriter = null; BufferedReader sysReader = null;// 定义缓冲字符输入流(从键盘读去消息) /** * 定义初始化方法,初始化I/O对象。 */ private void init(){ try { this.serverReader = new BufferedReader(new InputStreamReader(client.getInputStream())); this.serverWriter = new PrintWriter(client.getOutputStream()); this.sysReader = new BufferedReader(new InputStreamReader(System.in)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 接受客户端的socket引用 * @param client */ public ListenerThread(Socket client) { this.client = client; //用客户端的socket对象初始化本类的私有成员变量。 this.init(); //调用初始化方法,得到相应 I/O 对象。 } //实习Runnable接口的方法,编写自己的业务逻辑 public void run() { try { while (true) { //读取客户端写如socket管道的消息 System.out.println("正在读取客户端的消息:"); this.message = this.serverReader.readLine(); if(this.message.equals("exit")) { System.out.println("回话结束·······"); this.serverWriter.println("exit"); this.serverWriter.flush(); reader.close(); //关闭输入流 writer.close();//关闭输出流 cs.close(); //关闭socket管道 break; } System.out.println("client消息是:" + this.message); System.out.println("server:" + "输入您的语句:"); this.message = this.sysReader.readLine(); //从键盘读取消息 this.serverWriter.println(this.message); this.serverWriter.flush(); System.out.println("发送消息成功!"); } } catch (Exception e) { System.out.println("正常断开连接"); } } }

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档