zoukankan      html  css  js  c++  java
  • Socket实现简易聊天室,Client,Server

    package seday08;

    import java.io.BufferedWriter;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;

    /**
    * @author xingsir
    *简易聊天室客户端
    */
    public class Client {
    /*
    * 套接字 java.net.Socket
    * Socket封装了底层TCP协议的通讯细节,使用它可以通过
    * TCP协议与服务端建立链接,并以两条流进行IO操作完成 与服务端的数据交换
    */
    private Socket socket;//声明了一个 Socket类型的对象
    //构造方法
    public Client() {
    try {

    System.out.println("正在连接服务器。。。。。。");
    socket =new Socket("localhost",33069);//端口范围0-65535
    System.out.println("已成功连接服务端!");
    } catch (Exception e) {
    e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
    }
    }
    /*
    * 客户端开始工作的方法
    */
    public void start() {

    try {
    OutputStream out = socket.getOutputStream();//客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。
    OutputStreamWriter osw= new OutputStreamWriter(out);//字符转字节流
    BufferedWriter bw=new BufferedWriter(osw);//缓冲流
    PrintWriter pw =new PrintWriter(bw,true);//行更新
    Scanner scanner=new Scanner(System.in);//控制台输入,获取键盘输入信息
    while(true) {//条件为真
    String message=scanner.nextLine();
    pw.println(message);
    }
    } catch (Exception e) {
    e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
    }
    }

    public static void main(String[] args) {
    //实例化一个客户端
    Client client = new Client();
    //调用启动方法
    client.start();

    }

    }

    //===================================================================================

    package seday08;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    /**
    * @author xingsir
    * 服务器端
    */
    public class Server {
    private ServerSocket server;//声明了一个ServerSocket类型的对象
    //构造方法
    public Server() {
    try{
    System.out.println("服务器正在启动。。。。。。");
    server = new ServerSocket(33069);//接受的端口号
    System.out.println("服务端启动完毕!");
    }catch (IOException e) {
    e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
    }
    }
    //服务端工作方法
    public void start() {
    try {
    while(true) {
    System.out.println("等待客户端连接。。。。。。");
    Socket socket =server.accept();//accept():接受客户端的连接请求,并返回一个套接字
    System.out.println("一个客户端链接了!");
    /*
    * Socket提供的方法:InputStream getInputStream()
    * 通过Socket获取的输入流读取的字节是来自 远端计算机发送过来的字节。
    */
    InputStream in = socket.getInputStream();
    //将字节转换为字符
    InputStreamReader isr= new InputStreamReader(in,"UTF-8");
    BufferedReader br= new BufferedReader(isr);//块读,并且可以按行读取字符串

    String message = null;//声明字符串message,初始化呢为空
    /*
    * 通过BufferedReader读取客户端发送过来的一行字符串这个操作中,当客户端断开连接时,
    * 由于 客户端系统不同,服务端这里的表现也不相同:
    * windows客户端断开时,readLine方法会直接抛出异常
    * linux客户端断开连接时,readLine方法会返回 为null
    */
    while((message = br.readLine())!=null) {
    System.out.println("来自客户端的消息说:"+message);//控制台打印消息
    }

    }
    } catch (Exception e) {
    e.printStackTrace();//输出错误堆栈信息,有助于定位并解决错误
    }
    }

    public static void main(String[] args) {
    //实例化一个server端
    Server server = new Server();
    server.start();//调用方法
    }

    }

  • 相关阅读:
    iOS 自动识别URL(链接)功能的实现
    iOS 如何查看崩溃日志
    Swift-- 闭包
    Swift--方法(函数)
    Swift--控制流
    Swift--字典的了解
    数据存储与访问之——SharedPreferences
    汇编指令之STOS、REP
    汇编指令之ADC、SBB、XCHG、MOVS指令
    pushad与popad
  • 原文地址:https://www.cnblogs.com/xingsir/p/12053174.html
Copyright © 2011-2022 走看看