19 // refused: connect
20 Socket s1 = new Socket("localhost", 8888);
21 //打开输出流
22 OutputStream os = s1.getOutputStream();
23 //封装输出流
24 DataOutputStream dos = new DataOutputStream(os);
25 //打开输入流
26 InputStream is = s1.getInputStream();
27 //封装输入流
28 DataInputStream dis = new DataInputStream(is);
29 //读取键盘输入流
30 InputStreamReader isr = new InputStreamReader(System.in);
31 //封装键盘输入流
32 BufferedReader br = new BufferedReader(isr);
33
34 String info;
35 while (true) {
36 //客户端先读取键盘输入信息
37 info = br.readLine();
38 //把他写入到服务器方
39 dos.writeUTF(info);
40 //如果客户端自己说:bye,即结束对话
41 if (info.equals("bye"))
42 break;
43 //接受服务器端信息
44 info = dis.readUTF();
45 //打印
46 System.out.println("对方说: " + info);
47 if (info.equals("bye"))
48 break;
49 }
50 //关闭相应的输入流,输出流,socket对象
51 dis.close();
52 dos.close();
53 s1.close();
54 } catch (IOException e) {
55 e.printStackTrace();
56 }
57 }
58 }
运行效果:
服务器端效果>>>
1 对方说: hell
2 你好
3 对方说: 嘿嘿
4 你今天
5 对方说: 13
6 代售点
客户端端效果>>>
1 hell
2 对方说: 你好
3 嘿嘿
4 对方说: 你今
5 13
当前的程序不管是服务器端,还是客户端,都是单线程的。如: 服务器端说:"你好"
1 //读取键盘的输入流
2 info = br.readLine();
3 //写入到网络连接的另一边,即客户端
4 dos.writeUTF(info);
5 //如果服务器自己说:bye,也是结束对话
通过上面的代码,把"你好"发送出去了,这时候,程序又开始循环,运行到:
1 //接受客户端发送过来的信息
2 info = dis.readUTF();
这段代码,其实在这里就阻塞在这里了。要等到客户端那边说了话,"嘿嘿",这时候这里的
阻塞才会变为非阻塞状态,然后又继续说,说完后又继续阻塞......
而对于客户端来说,其实是一样的道理,客户端说完"hello"后,进入:
1 //接受服务器端信息 www.2cto.com
2 info = dis.readUTF();
到收听服务器端的信息,在这里也产生了阻塞,只有服务器端说了"你好",这个阻塞才变为非阻塞
状态。然后又继续接下来的动作....
============================================================
3.实现多线程的聊天室
============================================================
服务器端代码:
1 package com.b510.socket1705.freeechatroom;
2
3 import java.io.*;
4 import java.net.*;
5
6 /**
7 * 服务器端程序
8 *
9 * @author Hongten
10 *
11 * @time 2012-4-29 2012
12 */
13 public class TestServer {
14 public static void main(String args[]) {
15 try {
16 // 创建一个socket对象
17 ServerSocket s = new ServerSocket(8888);
18 // socket对象调用accept方法,等待连接请求
19 Socket s1 = s.accept();
20
21 // =========服务器端,在这里应该先打开输出流,在打开输入流,
22 // =========因为服务器端执行的操作是先听,再说,听,说,听,说.....
23
24 // 打开输出流
25 OutputStream os = s1.getOutputStream();
26 // 封装输出流
27 DataOutputStream dos = new DataOutputStream(os);
28 // 打开输入流
29 InputStream is = s1.getInputStream();
30 // 封装输入流
31 DataInputStream dis = new DataInputStream(is);
32 // 创建并启用两个线程
33 new MyServerReader(dis).start();
34 new