Socket通信实例(三)——多线程实例
来源:互联网 发布:战无不胜灵骑进阶数据 编辑:程序博客网 时间:2024/04/29 15:49
这几天电脑的Oracle数据库出了问题,把电脑重新安装了一下。多线程的实例拖了这么多天,先直接上代码了。
服务器端代码:
import java.io.*; import java.net.*; /** * 服务器端程序 * * @author JunwenYu * @time 2013-08-16 */public class TestServer { public static void main(String args[]) { try { // 创建一个socket对象 ServerSocket s = new ServerSocket(8888); // socket对象调用accept方法,等待连接请求 Socket s1 = s.accept(); // =========服务器端,在这里应该先打开输出流,在打开输入流, // =========因为服务器端执行的操作是先听,再说,听,说,听,说..... // 打开输出流 OutputStream os = s1.getOutputStream(); // 封装输出流 DataOutputStream dos = new DataOutputStream(os); // 打开输入流 InputStream is = s1.getInputStream(); // 封装输入流 DataInputStream dis = new DataInputStream(is); // 创建并启用两个线程 new MyServerReader(dis).start(); new MyServerWriter(dos).start(); } catch (IOException e) { e.printStackTrace(); } }}// 接受并打印客户端传过来的信息class MyServerReader extends Thread { private DataInputStream dis; public MyServerReader(DataInputStream dis) { this.dis = dis; } public void run() { String info; try { while (true) { // 如果对方,即客户端没有说话,那么就会阻塞到这里, // 这里的阻塞并不会影响到其他线程 info = dis.readUTF(); // 如果状态有阻塞变为非阻塞,那么就打印接受到的信息 System.out.println("对方说: " + info); if (info.equals("bye")) { System.out.println("对方下线,程序退出!"); System.exit(0); } } } catch (IOException e) { e.printStackTrace(); } }}// 从键盘获得输入流并写入信息到客户端class MyServerWriter extends Thread { private DataOutputStream dos; public MyServerWriter(DataOutputStream dos) { this.dos = dos; } public void run() { // 读取键盘输入流 InputStreamReader isr = new InputStreamReader(System.in); // 封装键盘输入流 BufferedReader br = new BufferedReader(isr); String info; try { while (true) { info = br.readLine(); dos.writeUTF(info); if (info.equals("bye")) { System.out.println("自己下线,程序退出!"); System.exit(0); } } } catch (IOException e) { e.printStackTrace(); } }}
客户端代码:
import java.io.*;import java.net.*;/** * 客户端程序 * * @author JunwenYu * * @time 2013-08-16 */public class TestClient { public static void main(String args[]) { try { // 创建socket对象,指定服务器的ip地址,和服务器监听的端口号 // 客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么 // 这时候就会找不到服务器,并同时抛出异常==》java.net.ConnectException: Connection // refused: connect Socket s1 = new Socket("127.0.0.1", 8888); // =========客户端,在这里应该先打开输入流,在打开输出流, // =========因为客户端执行的操作是先说,再听,说,听,说,听..... // 打开输入流 InputStream is = s1.getInputStream(); // 封装输入流 DataInputStream dis = new DataInputStream(is); // 打开输出流 OutputStream os = s1.getOutputStream(); // 封装输出流 DataOutputStream dos = new DataOutputStream(os); // 创建并启用两个线程 new MyClientReader(dis).start(); new MyClientWriter(dos).start(); } catch (IOException e) { e.printStackTrace(); } }}// 接受并打印服务器端传过来的信息class MyClientReader extends Thread { private DataInputStream dis; public MyClientReader(DataInputStream dis) { this.dis = dis; } public void run() { String info; try { while (true) { info = dis.readUTF(); System.out.println("对方说: " + info); if (info.equals("bye")) { System.out.println("对方下线,程序退出!"); System.exit(0); } } } catch (IOException e) { e.printStackTrace(); } }}// 从键盘获得输入流并写入信息到服务器端class MyClientWriter extends Thread { private DataOutputStream dos; public MyClientWriter(DataOutputStream dos) { this.dos = dos; } public void run() { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String info; try { while (true) { info = br.readLine(); dos.writeUTF(info); if (info.equals("bye")) { System.out.println("自己下线,程序退出!"); System.exit(0); } } } catch (IOException e) { e.printStackTrace(); } }}
今天写贴代码,注释也已经很清楚了,日后再具体来说,或者直接联系我的QQ:445574292。
下一期写一个Java与C用Socket进行通信的例子,也是我们暑期实习时做过的一个例子。客户端用Java做,服务器端用C。
- Socket通信实例(三)——多线程实例
- Socket通信实例(二)——单线程实例
- Android进阶——Socket通信实例
- 服务器开发—Socket通信实例(一)
- 服务器开发—Socket通信实例(二)
- socket TCP通信实例
- java Socket通信实例
- Socket通信实例
- Socket通信实例
- java Socket通信实例
- socket通信实例
- Socket通信实例
- java socket 通信实例
- java socket通信实例
- JAVA socket通信实例
- Socket通信实例一
- Socket通信实例二
- Socket通信实例
- jQuery LigerUI V1.2.0 (包括API和全部源码) 发布
- jquery实现图片裁剪
- 当移动遇见大数据与云计算
- C语言运算符优先级和口诀
- POJ 2002 Squares
- Socket通信实例(三)——多线程实例
- ios contentSize contentOffset contentInset
- OSAL任务调度
- GPS数据包的ASCII异或校验和计算方法(VC++)
- Android APK 签名比对
- android opengl floatbuffer
- 利用 Oracle Database 12c 实现性能创新
- java 对 xml 操作
- jQuery LigerUI V1.0(包括API和全部源码) 发布