zoukankan      html  css  js  c++  java
  • [JavaWeb基础] 024.Socket编程之简单的聊天程序

    1.Socket的简介

    1)什么是Socket

    网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个SocketSocket通常用来实现客户方和服务方的连接。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

  • 相关阅读:
    国庆七天乐——第二天
    国庆七天乐——第一天
    线段树+树状数组+分块+循环展开 的模板
    AOE网络——求关键路径
    最小生成树模板+并查集(隐藏)+结构体排序模板
    并查集模板
    最短路径模板总结
    newifi mini将led指示灯引出当gpio使用
    openwrt 无线中继
    笔记本硬盘盒改装台式机硬盘盒
  • 原文地址:https://www.cnblogs.com/superdo/p/4890437.html
Copyright © 2011-2022 走看看