标签:style blog http io ar color os sp for
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 }
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/gongxijun/p/4164182.html