Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

网络编程>>基本的Socket编程

Posted on 2009-12-12 16:04 啥都写点 阅读(223) 评论(0)  编辑  收藏 所属分类: J2SE
      Socket 服务器端需要在某个端口上开启服务端类型的Socket,即java.net.ServerSocket.通过它的accept方法等待并接收客户端的请求,返回的是一个java.net.Socket对象,如果一直没有客户端请求,那么accept方法将会一直等待。
      Socket 客户端根据服务器端的IP地址和端口号创建一个Socket对象,连接服务器。
      服务器端和客户端都持有一个Socket对象,服务器端的Socket从服务器端指向客户端,而客户端的Socket从客户端指向服务器端,就像在服务器和客户端建立了两条单向的管道
      Socket 类提供的getOutputStream方法获得Socket的输出流,getInputStream方法获得Socket的输入流。

/**---------------------------SimpleServer.java-------------------------------*/



/**
 * 一个简单的socket服务器,能接受客户端请求,并将请求返回给客户端
 
*/

public class SimpleServer {
    
// 服务端侦听的Socket
    ServerSocket serverSkt = null;
    
// 客户端
    Socket clientSkt = null;

    
// 客户端输入流
    BufferedReader in = null;
    
// 客户端输出流
    PrintStream out = null;

    
// 构造方法
    public SimpleServer(int port){
        System.out.println(
"服务器代理正在监听,端口:" + port);
        
try {
            
// 创建监听socket
            serverSkt = new ServerSocket(port);
        }
 catch (IOException e) {
            System.out.println(
"监听端口" + port + "失败");
        }

        
try {
            
// 接收连接请求
            clientSkt = serverSkt.accept();
        }
 catch (IOException e) {
            System.out.println(
"连接失败");
        }

        
try {
            
// 获得输出输出流
            in = new BufferedReader(new InputStreamReader(clientSkt
                    .getInputStream()));
            out 
= new PrintStream(clientSkt.getOutputStream());
        }
 catch (IOException e) {
        }

    }


    
// 收到客户端请求
    public String getRequest() {
        String frmClt 
= null;
        
try {
            
// 从客户端的输入流中读取一行数据
            frmClt = in.readLine();
            System.out.println(
"Server 收到请求:" + frmClt);
        }
 catch (Exception e) {
            System.out.println(
"无法读取端口..");
            System.exit(
0);
        }

        
return frmClt;
    }


    
// 发送响应给客户端
    public void sendResponse(String response) {
        
try {
            
// 往客户端输出流中写数据
            out.println(response);
            System.out.println(
"Server 响应请求:" + response);
        }
 catch (Exception e) {
            System.out.println(
"写端口失败");
            System.exit(
0);
        }

    }


    
public static void main(String[] args) throws IOException {
        
// 启动服务器
        SimpleServer sa = new SimpleServer(8888);
        
while (true{
            
// 读取客户端的输入并返回给客户端。
            sa.sendResponse(sa.getRequest());
        }

    }


}

/**--------------------------SimpleClient.java--------------------------*/

/**
 * 一个简单的socket客户端,能够往服务器发送socket请求。
 
*/

public class SimpleClient {
    
    
// 客户端输入输出流
    PrintStream out;
    BufferedReader in;

    
// 构造方法
    public SimpleClient(String serverName, int port) {
        
try {
            
// 根据服务器名和端口号,连接服务器
            Socket clientSocket = new Socket(serverName, port); 
            
// 获取socket的输入输出流
            out = new PrintStream(clientSocket.getOutputStream());
            in 
= new BufferedReader(new InputStreamReader(clientSocket
                    .getInputStream()));
        }
 catch (Exception e) {
            System.out.println(
"无法连接服务器!");
        }

    }


    
// 发送请求
    public void sendRequest(String request) {
        
// 向socket的输出流写数据
        out.println(request); 
        System.out.println(
"Client 发送请求: " + request);
    }


    
public String getResponse() {
        String str 
= new String();
        
try {
            
// 从socket的输入流中读取数据
            str = in.readLine();
            System.out.println(
"Client收到Server返回: " + str);
        }
 catch (IOException e) {
        }
 
        
return str;
    }

}





/**-----------------------------ClientFrame.java---------------------------------------*/

/**
 * 客户端的图形界面
 
*/

public class ClientFrame extends JFrame implements ActionListener {
    
// "发送"按钮
    JButton sendButton; 
    
// 发送内容的输入框
    JTextField inputField; 
    
// 服务器返回内容的文本域
    JTextArea outputArea;

    
// 客户端socket对象
    SimpleClient client;

    
// 在构造函数中完成图形界面的初始化
    public ClientFrame() {
        JLabel label1 
= new JLabel("输入: ");
        inputField 
= new JTextField(20);
        JPanel panel1 
= new JPanel();
        panel1.add(label1);
        panel1.add(inputField);

        JLabel label2 
= new JLabel("服务器返回: ");
        outputArea 
= new JTextArea(620); 
        JScrollPane crollPane 
= new JScrollPane(outputArea);
        JPanel panel2 
= new JPanel();
        panel2.setLayout(
new BorderLayout());
        panel2.add(label2, BorderLayout.NORTH);
        panel2.add(crollPane, BorderLayout.CENTER);

        sendButton 
= new JButton("发 送");
        sendButton.addActionListener(
this);
        
        JPanel panel 
= new JPanel(); 
        panel.setLayout(
new BorderLayout()); 
        panel.add(panel1, BorderLayout.NORTH);
        panel.add(sendButton, BorderLayout.CENTER);
        panel.add(panel2, BorderLayout.PAGE_END);

        setTitle(
"Socket 客户端");
        
this.getContentPane().add(panel);
        
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    
public void actionPerformed(ActionEvent ae) {
        
// 判断事件源控件是否是"发送"按钮
        if (ae.getSource() == sendButton) {
            
try {
                
// 发送文本框中的文本
                client.sendRequest(inputField.getText()); 
            }
 catch (Exception ex) {
                ex.printStackTrace();
            }

            
// 接收服务器回应并写入文本域
            outputArea.append(client.getResponse() + "\n"); 
        }

    }


    
public static void main(String[] args) {
        ClientFrame frame 
= new ClientFrame();
        frame.pack();
        
// 连接服务器
        frame.client = new SimpleClient("127.0.0.1"8888); 
        frame.setVisible(
true);

    }


}







                                                                                                       --    学海无涯