黑马程序员技术交流社区

标题: Java网络编程--Socket [打印本页]

作者: sixth    时间: 2012-11-6 14:56
标题: Java网络编程--Socket
在网络编程中,Socket是一种非常通用的方式。所谓socket通常被翻译成"套接字"。很晦涩。其实按我的理解所谓socket就是指两者之间通信的一个管道。
     好比刚见面的两个人,一个人伸出手去,等待和你握手。这时候,先伸手的人就是服务器。后伸手的人就是客户端,但是一旦两人握上了手,那么都可以摇手表示你好你好啊。
  又好比一部等待呼入的电话A。就可以看成一个服务器。来等待其它人的呼入。一旦你用话机拨打了A的号码。那么你的话机B就是客户端,A就是服务器啦。那么你们就通过电话线建立了一个通信的Socket了。
Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
首先建立一个服务器端代码如下:
//服务器
public class Server0312 {
    Socket socket=null; //套接字
    InputStream is =null;//输入流
    OutputStream os =null;//输出流
    BufferedReader br =null;
    public Server0312(){
        try {
            ServerSocket server =new ServerSocket(5005);
            socket=    server.accept();
            System.out.println("服务已连接---");
            is =socket.getInputStream();
            os=socket.getOutputStream();
            br=new BufferedReader(new InputStreamReader(is));
            os.write("welcome".getBytes());//发送给客户端
            os.flush();
            String said=br.readLine();//可以一次读取一行,读取客户端发来的消息
            System.out.println("client said:"+said);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                br.close();
                is.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new Server0312();
    }
}
然后建立一个客户端代码:
public class Client0312 {
    Socket socket=null; //套接字
    InputStream is =null;//输入流
    OutputStream os =null;//输出流
    BufferedWriter bw=null;
    public Client0312(){
        try {
            socket=new Socket("127.0.0.1",5005);//指定连接地址和端口
            is =socket.getInputStream();
            os=socket.getOutputStream();
            bw=new BufferedWriter(new OutputStreamWriter(os));
            byte[] b =new byte[1024];
            int len=is.read(b);
            String s =new String(b,0,len);
            System.out.println("服务器说:"+s);
            bw.write("hello");
            bw.flush();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                bw.close();
                is.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        new Client0312();
    }
}
程序首先运行服务端,然后运行CLient程序,服务器首先说Welcome.客户端收到后说hello.
这是一个非常简单的c/s通讯模型。
如果服务器要一直运行并监听的话。服务器必须开启线程了。以下为SLideshare的ppt
作者: 奋斗的青春    时间: 2012-11-6 22:19
学习了 。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2