Socket编程半双工

服务器

package com.test;
import java.io.IOException;
import java.net.*;
import java.io.*;
public class MyServer {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyServer ms = new MyServer();
    }
    public MyServer(){
        try {
            //服务器用ServerSocket对象创建  参数代表的是在9999端口上监听
            System.out.println("服务器在9999端口等待监听...");
            ServerSocket ss = new ServerSocket(9999);
            //等待监听 accept() 方法返回的是Socket对象
            Socket s = ss.accept();
            //接收客户端输入的数据
            InputStreamReader isr =new InputStreamReader(s.getInputStream());
            BufferedReader br = new BufferedReader(isr);
            //接收控制台输入的数据
            InputStreamReader isr2 =new InputStreamReader(System.in);
            BufferedReader br2 = new BufferedReader(isr2);
            //想客户端写入输出流
            PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
            while(true){
                String infoFromClient = br.readLine();
                if(infoFromClient.equals("exit"))
                {
                    System.out.println("结束对话!");
                    s.close();
                    break;
                }
                System.out.println("客户端说:"+infoFromClient);
                System.out.println("请输入您想对客户端说的话:");
                String info = br2.readLine();
                pw.println(info);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

}

客户端

package com.test;
import java.net.*;
import java.io.*;
public class MyClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MyClient mc = new MyClient();
    }
    public MyClient(){
        try {
            //创建客户端连接通道对象 第一个参数表示连接服务器的ip 第2个参数表示连接哪个端口
            Socket s = new Socket("127.0.0.1",9999);
            //向服务器发送数据  创建写对象 向通道对象的输出流写入数据 true代表及时刷新数据
            PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
            //创建一个输入流  接收从控制台输入的数据
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            
            InputStreamReader isr2 = new InputStreamReader(s.getInputStream());
            BufferedReader br2 = new BufferedReader(isr2);
            
            while(true){
                System.out.println("请输入您想对服务器说的话:");
                String infoFromControl = br.readLine();
                
                pw.println(infoFromControl);
                if(infoFromControl.equals("exit"))
                {
                    System.out.println("对话结束!");
                    s.close();
                    break;
                }
                String info = br2.readLine();
                System.out.println("服务器说:"+info);
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

}

需要注意的地方是,当退出对话判断客户端判断要在想服务端发送数据后判断 不然 服务器没接收到  客户端就关闭了 在这里从两个地方读取数据流 一个是s通道  另一个从控制台读取数据流

posted on 2016-10-13 22:00  Lightt  阅读(425)  评论(0编辑  收藏  举报