1 package Day_1;
2
3 import java.io.DataInputStream;
4 import java.io.DataOutputStream;
5 import java.io.EOFException;
6 import java.io.IOException;
7 import java.net.ConnectException;
8 import java.net.Socket;
9 import java.net.SocketException;
10 import java.net.UnknownHostException;
11 import java.util.Scanner;
12
13 /*
14 * 对于聊天室而言,不需要进行单线程进行即可。
15 * 和Socket编程
16 * */
17 public class Client {
18
19 private DataInputStream Dis = null;
20 private DataOutputStream Dos = null;
21 private boolean connect = false;
22 Socket sc = null;
23
24 public static void main(String args[]) {
25 new Client().start();
26 }
27
28 private void send(String str) {
29 try {
30 Dos.writeUTF(str);
31 } catch (IOException e) {
32 // TODO Auto-generated catch block
33 e.printStackTrace();
34 }
35 }
36
37 private void sec() {
38 try {
39 System.out.println("这是来自服务器:" + sc.getInetAddress() + ": "
40 + Dis.readUTF());
41 } catch (EOFException e) {
42 System.out.println("该客户端退出了!");
43 } catch (IOException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 }
48
49 public void start() {
50 try {
51 // 建立连接
52 sc = new Socket("127.0.0.1", 8888);
53 Dos = new DataOutputStream(sc.getOutputStream());
54 Dis = new DataInputStream(sc.getInputStream());
55 connect = true; // 可以开始通话了
56 } catch (ConnectException e) {
57 System.out.println("服务器,木有打开!");
58 } catch (IOException e) {
59 // TODO Auto-generated catch block
60 e.printStackTrace();
61 }
62 while (connect) {
63 Scanner read = new Scanner(System.in);
64 while (read.hasNext()) {
65 String st = read.next();
66 if (st.equals("exit")) {
67 try {
68 if (Dos != null)
69 Dos.close();
70 if (Dis != null)
71 Dis.close();
72 if (sc != null)
73 sc.close();
74 } catch (IOException e) {
75 // TODO Auto-generated catch block
76 e.printStackTrace();
77 }
78 connect=false;
79 break;
80 }
81 this.send(st);
82 this.sec();
83 }
84 }
85 }
86 }
1 package Day_1;
2
3 import java.io.DataInputStream;
4 import java.io.DataOutputStream;
5 import java.io.EOFException;
6 import java.io.IOException;
7 import java.net.BindException;
8 import java.net.ServerSocket;
9 import java.net.Socket;
10 import java.util.ArrayList;
11 import java.util.Deque;
12 import java.util.List;
13 import java.util.concurrent.ExecutorService;
14 import java.util.concurrent.Executors;
15
16
17 public class GetPicture {
18
19 /**
20 * @param args
21 * 聊天室有n个人在聊天,聊天服务器就应该为每个进入聊天室的人创建一个对应的线程,
22 * 该线程监听对应的聊天者是否有消息传来。如果有,则向所有的聊天者广播该消息。
23 * 实现该网络聊天系统、
24 */
25 private boolean started =false;
26 private boolean connect=false;
27 //放置一个链表来存放新建的客户端
28 List<NewClient> list=new ArrayList<NewClient>() ;
29 //设定一个无限制大小的线程池
30 ExecutorService es = Executors.newCachedThreadPool();
31 public static void main(String[] args) {
32 // TODO Auto-generated method stub
33 new GetPicture().start();
34 }
35
36 public void start(){
37 final int port=8888;
38 ServerSocket ss = null ;
39 try {
40 //创建套接字
41 ss = new ServerSocket(port);
42 connect = true;
43 }catch(BindException e)
44 {
45 //不做任何处理
46 }
47 catch (IOException e) {
48 // TODO Auto-generated catch block
49 e.printStackTrace();
50 }
51 //如果连接上,则表示不断的创建客户端对象
52 try {
53 while(connect){
54 //表示不断的监听
55 Socket st = ss.accept();
56 //将套接字放进 NewClient类中
57 NewClient nc = new NewClient(st);
58 //将NewClient类放进线程中,创建多线程
59 // new Thread(nc).start(); //创建线程
60 //放进线程池中
61 es.execute(new Thread(nc));
62 //将newClient放进链表中
63 list.add(nc);
64 System.out.println("客戶端接收成功");
65 } }catch (IOException e) {
66 // TODO Auto-generated catch block
67 e.printStackTrace();
68 }
69 }
70
71
72 //创建一个新的客户端类
73 class NewClient implements Runnable
74 {
75 DataInputStream Dis = null;
76 DataOutputStream Dos = null;
77 Socket sc=null;
78 boolean started=false; //初始断开
79 public NewClient(Socket st){
80 this.sc=st;
81 try {
82 //获得对方发过来的缓存数据流
83 Dis = new DataInputStream(st.getInputStream());
84 Dos = new DataOutputStream(st.getOutputStream());
85 //如果正常说明,已经接收到了对方的发送过来的数据、
86 started =true;
87 } catch (IOException e) {
88 // TODO Auto-generated catch block
89 e.printStackTrace();
90 }
91 }
92 public void send(String str)
93 {
94 try {
95 // 将数据写入到对方的内存中
96 Dos.writeUTF(str);
97 }
98 catch(EOFException e){
99 System.out.println("对方客户端退出了!");
100 } catch (IOException e) {
101 // TODO Auto-generated catch block
102 e.printStackTrace();
103 }
104 }
105 @Override
106 public void run() {
107 // TODO Auto-generated method stub
108 //如果连接上了,就可以提取相应的数据
109 String str=null;
110 try {
111 while(started){
112 //采用UTF-8的编码格式进行流的输入输出
113 str = Dis.readUTF();
114 /*for(int i=0;i<list.size() ;i++){
115 list.get(i).send(str);
116 }*/
117 for( NewClient sc : list )
118 sc.send(str);
119 }
120 }catch(EOFException e){
121 //绑定异常,说明退出了
122 System.out.println("该客户端退出了!");
123 }catch (IOException e) {
124 // TODO Auto-generated catch block
125 e.printStackTrace();
126 }finally{
127 //当该线程消亡的时候,给予相应流的关闭
128 try {
129 if(Dos!=null)Dos.close();
130 if(Dis!=null)Dis.close();
131 if(sc!=null)sc.close();
132 } catch (IOException e) {
133 // TODO Auto-generated catch block
134 e.printStackTrace();
135 }
136 }
137 }
138 }
139 }