现在的位置: 首页 > 综合 > 正文

Socket编程之旅(服务器与客户端沟通)

2012年04月08日 ⁄ 综合 ⁄ 共 6797字 ⁄ 字号 评论关闭

我自己也写了一个这样的程序,不过我参考了这一个代码,而且给了我启发,而且比我的要简洁,就直接上吧。程序中最大的变化就是在服务器端,我已经在关键的地方潜入了解释。好吧,直接上代码。

服务器端: 

import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
    public static void main(String args[]) {
        Hashtable<String,DataOutputStream> userList = new Hashtable<String,DataOutputStream>(); 
        String name;
        DataInputStream dis;
        DataOutputStream dos;
        try{
            //监听9999端口
            ServerSocket ss = new ServerSocket(9999);
            //始终是循环接收客户端的请求
            while(true){
                Socket s = ss.accept();    
                //获得输入流
                dis = new DataInputStream(s.getInputStream());
                //获得输出流
                dos = new DataOutputStream(s.getOutputStream());
                //读取客户端传送过来的名字信息
                name = dis.readUTF();
//                name = s.getPort()+"";
                
//System.out.println("abc"+name);
                
//把客户端传送过来的名字信息以及是输出流以键值对的形式保存在Hashtable当中
                userList.put(name,dos);
                //把1.客户端传送过来的参数
                
//2.输入流对象
                
//3. 把(1)和输出流的HashTable
                
//作为参数去启动一个线程
                new MyServerReader(name,dis,userList).start();
            }
        }catch(Exception e){
            e.printStackTrace();    
        }
    }
}

class MyServerReader extends Thread{
    private String name;
    private DataInputStream dis;
    private Hashtable<String,DataOutputStream> userList;
    public MyServerReader(String name,DataInputStream dis,Hashtable<String,DataOutputStream> userList ){
        this.name = name;
        this.dis = dis;    
        this.userList = userList;
    }
    public void run(){
        String info;
        try{
            transmitMessage(name + " in!","--Server Info--");    
            //时刻判断输入的字符当中是否包含有bye
            while(true){
                //时刻读取字符
                info = dis.readUTF();
                System.out.println("Server========>"+info);
                if(info.equals("bye")){
                    DataOutputStream dos = (DataOutputStream)(userList.get(name));
                    Thread.sleep(1000);
                    dos.close();
                    dis.close();
                    userList.remove(name);
                    transmitMessage(name + " out!","--Server Info--");    
                    break;
                }else if(info.length()>0){
                    //如果输入的字符不是bye,并且是有内容的就把数据发送出去
                    transmitMessage(info,name);    
                }
            }        
        }catch (Exception e) {
        }
    } 
    public void transmitMessage(String msg,String name){
        Collection doses = userList.values();
        DataOutputStream dos;
        for(Object o: doses){
            dos = (DataOutputStream)o;
            try{
                //向所有的连接客户端发送信息,这里可以通过扩展发送给指定人
                dos.writeUTF(name + ":" + msg);
            }catch(Exception e){
            }
        }            
    }  

 

客户端:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class ChatClient {
    private String name;
    private Socket s;
    private DataInputStream dis;
    private DataOutputStream dos;
    private Frame f;
    private TextArea ta;
    private TextField tf;
    private boolean runnable = true;    
        
    public static void main(String args[]) {
        ChatClient cc = new ChatClient();
        cc.createUI();
        cc.inputName();        
        cc.connect();    
        cc.createThread();
    }
    public void createUI(){
        f = new Frame("Client");
        ta = new TextArea();
        ta.setEditable(false);
        tf = new TextField();
        Button send = new Button("Send");
        Panel p = new Panel();
        p.setLayout(new BorderLayout());
        p.add(tf,"Center");
        p.add(send,"East");
        f.add(ta,"Center");
        f.add(p,"South");
        MyClientListener listener = new MyClientListener(this);
        send.addActionListener(listener);
        tf.addActionListener(listener);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                ChatClient.this.shutDown();    
            }    
        });
        f.setSize(400,400);
        f.setLocation(600,0);
        f.setVisible(true);    
        tf.requestFocus();
    }
    public void inputName(){
        String name = javax.swing.JOptionPane.showInputDialog("Input Your Name:");
        this.setName(name);    
        f.setTitle(name);
    }
    public void connect(){
        try {        
            s = new Socket("127.0.0.1",9999);
            dos = new DataOutputStream(s.getOutputStream());
            dis = new DataInputStream(s.getInputStream());
            dos.writeUTF(name);
        }catch (IOException e) {
            e.printStackTrace();        
        }
    }    
    public void createThread(){
        MyClientReader reader = new MyClientReader(this);
        reader.start(); 
    }
    public void stop(){
        runnable = false;    
    }
    public void shutDown(){
        try{
            dos.writeUTF("bye");
            ta.append("Exit in 5 seconds!");
            this.stop();            
            Thread.sleep(5000);
            dis.close();
            dos.close();
            s.close();
        }catch(Exception e){
        }
        System.exit(0);                        
    }
    public boolean getRunnable(){
        return runnable;
    }            
    public void setName(String name){
        this.name = name;
    }
    public DataInputStream getDataInputStream(){
        return dis;    
    }
    public DataOutputStream getDataOutputStream(){
        return dos;    
    }
    public TextArea getTextArea(){
        return ta;    
    }
    public TextField getTextField(){
        return tf;    
    }
}

class MyClientListener implements ActionListener{
    
    private ChatClient client;    
    public MyClientListener(ChatClient client){
        this.client = client;
    }
    public void actionPerformed(ActionEvent e){
        TextField tf = client.getTextField();
        String info = tf.getText();
        try{
            client.getDataOutputStream().writeUTF(info);    
        }catch (IOException e1) {
            e1.printStackTrace();        
        }
        if(info.equals("bye")){
            client.shutDown();    
        }
        tf.setText("");
        tf.requestFocus();        
    }    
}

class MyClientReader extends Thread{
    private ChatClient client;
    public MyClientReader(ChatClient client){
        this.client = client;    
    }
    public void run(){
        String info;
        DataInputStream dis = client.getDataInputStream();
        TextArea ta = client.getTextArea();
        try{
            while(client.getRunnable()){
                info = dis.readUTF();
                System.out.println("Client=====>"+info);
                ta.append(info + "\n");
            }        
        }catch (IOException e) {
        }    
    }    

抱歉!评论已关闭.