[JavaWeb基础] 024.Socket编程之简单的聊天程序
1.Socket的简介
1)什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
2)Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
2.Socket的Server端代码
package com.babybus.sdteam.server; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TalkServer { public static void main(String args[]) { try{ ServerSocket server=null; try{ // 创建一个ServerSocket在端口4700监听客户请求 server=new ServerSocket(4700); }catch(Exception e) { // 出错,打印出错信息 System.out.println("can not listen to:"+e); } Socket socket=null; try{ // 使用accept()阻塞等待客户请求,有客户 // 请求到来则产生一个Socket对象,并继续执行 socket=server.accept(); }catch(Exception e) { System.out.println("Error."+e); //出错,打印出错信息 } String line; // 由Socket对象得到输入流,并构造相应的BufferedReader对象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); // 由Socket对象得到输出流,并构造PrintWriter对象 PrintWriter os = new PrintWriter(socket.getOutputStream()); // 由系统标准输入设备构造BufferedReader对象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); // 在标准输出上打印从客户端读入的字符串 System.out.println("Client:"+is.readLine()); // 从标准输入读入一字符串 如果该字符串为 "bye",则停止循环 line=sin.readLine(); while(!line.equals("bye")){ // 向客户端输出该字符串 os.println(line); // 刷新输出流,使Client马上收到该字符串 os.flush(); // 在系统标准输出上打印读入的字符串 System.out.println("Server:"+line); // 从Client读入一字符串,并打印到标准输出上 System.out.println("Client:"+is.readLine()); line=sin.readLine(); } // 关闭Socket输出流 os.close(); // 关闭Socket输入流 is.close(); // 关闭Socket socket.close(); // 关闭ServerSocket server.close(); }catch(Exception e){ System.out.println("Error:"+e); } } }
3.Socket的Client端代码
package com.babybus.sdteam.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class TalkClient { public static void main(String[] args) { try { // 新建一个socket Socket socket = new Socket("127.0.0.1", 4700); // 向本机的4700端口发出客户请求 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); // 由系统标准输入设备构造BufferedReader对象 PrintWriter os=new PrintWriter(socket.getOutputStream()); // 由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); // 由Socket对象得到输入流,并构造相应的BufferedReader对象 String readline; // 从系统标准输入读入一字符串 readline=sin.readLine(); while(!readline.equals("bye")){ // 若从标准输入读入的字符串为 "bye"则停止循环 os.println(readline); // 将从系统标准输入读入的字符串输出到Server os.flush(); // 刷新输出流,使Server马上收到该字符串 System.out.println("Client:"+readline); // 在系统标准输出上打印读入的字符串 System.out.println("Server:"+is.readLine()); // 从Server读入一字符串,并打印到标准输出上 readline=sin.readLine(); //从系统标准输入读入一字符串 } os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
4.上面已经写得很详细了,有兴趣的创建个Java程序运行下就明白了。
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4890437.html