本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获的,毕竟讲真,想要把Java搞得有形有色的也是很不容易的,借助可视化的插件windowsBuilder,这个过程还是既exciting 又tiring的。
好吧 ,然而图形界面已经成为了历史,现在来说说这个功能正确的console 吧
我也是刚知道的Eclipse里面是可以跑好多个程序的,只要你的一个.java文件中有public static void main,他就能给你一个窗口,让你跑起来。只不过这些窗口堆叠在一起,需要自行选择不同的窗口进行IO操作。
总的思路是采用c/s的方式,client借助socket完成向server的发送和接受两个工作,当然了,为了体现出真实情况下的双工的特点,发送和接受是需要开两个线程的,也就是说,一个用户需要自己管理两个线程。server则相对来讲比较复杂,因为这里面涉及到了调度,server需要有发送消息给在线client的线程(这个线程要做的事情就是只要有消息就要把消息发到所有的用户的窗口),以及接受client发来的消息的线程(这个线程要做的事情就是将接收到的消息全部交给发送消息的线程,于是这两个线程之间的通信问题也是实现上的一个关键~),为了使得所有的用户消息是同步的,server需要管理一个用户线程的列表,用以实现用户的行为的控制,于是乎这就要求只要有用户请求连接服务器,服务器就要为用户新建一个线程,那么client 和server 之间靠什么来进行联系呢,那就是我们的socket了。
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 import java.io.PrintWriter; 4 import java.net.Socket; 5 6 public class Client extends Thread{ 7 8 private static String serverIp = "127.0.0.1"; 9 private static int serverPort = 8001; 10 11 private Socket clientsSocket; //plays key role 12 private PrintWriter pw; // for send data 13 private BufferedReader br; // for receive data 14 15 public Client(){ 16 try { 17 clientsSocket = new Socket(serverIp, serverPort); 18 pw = new PrintWriter(clientsSocket.getOutputStream(),true); 19 br = new BufferedReader(new InputStreamReader(clientsSocket.getInputStream())); 20 new readServer(); 21 22 while(true){ 23 br = new BufferedReader(new InputStreamReader(System.in)); 24 String input = br.readLine(); 25 //System.out.println("this is the input :" + input); 26 pw.println(input); 27 } 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } 31 } 32 33 class readServer extends Thread{ 34 private BufferedReader reader; 35 36 public readServer(){ 37 try { 38 reader = new BufferedReader(new InputStreamReader(clientsSocket.getInputStream())); 39 start(); 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 } 44 45 public void run(){ 46 try { 47 while(true){ 48 String content = reader.readLine(); 49 if(content.equals("bye Client")){ 50 break; 51 } 52 else { 53 System.out.println(content); 54 } 55 } 56 } catch (Exception e) { 57 e.printStackTrace(); 58 } 59 } 60 } 61 62 public static void main(String[] args) throws Exception{ 63 new Client(); 64 } 65 }