欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java socket-2--即时通信

程序员文章站 2022-06-05 22:02:39
...

上一篇 java socket-1–通信(双向)

参照网上的一个视频做的即时通信
用java-swing做了一个简单的界面,基本实现了客户端与服务端的通信


服务端

package 聊天室;

import java.awt.Color;
import java.awt.Font;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class SkServer extends JFrame implements ActionListener{

    //--------------------------创建窗体内容
    //创建一个显示标签
    private JLabel label = new JLabel("聊聊");
    //创建文本输入框
    private JTextField textf = new JTextField(18);
    //创建显示聊天记录的文本框
    private JTextArea  texta = new JTextArea();
    //创建面板容器    
    private JPanel pl = new JPanel();

    //--------------------------创建基于socket编程的对象
    private ServerSocket server = null; //服务端的socket
    private Socket client = null;   //客户端的socket


    //----------------------------创建输入输出流
    private InputStream input =null;
    private OutputStream output = null;

    //构造方法
    public SkServer(){
    //---------------------------------------------------概述窗口
    this.setSize(280,300);          //设置窗口大小
    this.setTitle("=服务端=");
    this.setVisible(true);          //设置窗口是否可见
    this.setLocationRelativeTo(null);   //窗口位置居中
    this.add("North",pl);           //边界布局,把面板容器放在北部
    this.add("Center", texta);      //把消息框放在中间
    label.setFont(new Font("宋体",Font.BOLD, 15));
    //------------------------------------------------设置聊天记录文本框
    texta.setBackground(Color.white);   //设置背景颜色
    texta.setFont(new Font("宋体", Font.BOLD, 12));//设置字体
    texta.setForeground(Color.green);   //设置字体颜色
    //--------------------------------------------------设置文本输入框
    pl.add(label);                  //添加标签到面板容器
    pl.add(textf);              //添加输入框到面板容器

    //---------------------------------------------------添加事件
    textf.addActionListener(this);
    addWindowListener(new WindowAdapter() {
        public void WindowClosing(WindowEvent e)
        {

        System.exit(0);
        }
    });

    //--------------------------------------------------创建客户端与服务端的连接

    try {
        server = new ServerSocket(10006);    //端口要没有被其他线程使用,否则会抛出错误
        client = server.accept();       //当客户端请求时,建立连接        阻塞式
        texta.append("客户端已经连接\n\n");
        System.out.println("客户端已经连接");
        input = client.getInputStream();
        output = client.getOutputStream();

    } catch (Exception e) {

        System.out.println("服务端连接已经关闭\n\n");        
    }

    //----------------------------------------------------获得客户端的消息

    while(true){
        try {
        byte[] mess = new byte[256];
        input.read(mess);
        String inputMess = new String(mess);
        texta.append("客户端:"+inputMess);
        texta.append("\n\n");

        } catch (Exception e) {
        System.out.println("服务端连接关闭");

        }


    }

    }

    public static void main(String[] args) {
    new SkServer();

    }

    //-----------------------------------------------------

    public void actionPerformed(ActionEvent e){
    //-------------------------------------------------发送消息给客户端
    try {
        String str = textf.getText();
        byte[] putMess = str.getBytes();         //获得文本框的输入信息
        output.write(putMess);                   //发送消息给给客户端 
        textf.setText("");              //清空输入框
        texta.append("我:"+str);
        texta.append("\n\n");

    } catch (Exception e2) {

        System.out.println("失去连接");

    }


    }


}

客户端

package 聊天室;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class SkClient extends JFrame implements ActionListener{

    //--------------------------创建窗体内容
    //创建一个显示标签
    private JLabel label = new JLabel("说说");
    //创建文本输入框
    private JTextField textf = new JTextField(18);
    //创建显示聊天记录的文本框
    private JTextArea  texta = new JTextArea();
    //创建面板容器    
    private JPanel pl = new JPanel();

    //--------------------------创建基于socket编程的对象

    private Socket socket = null;

    //----------------------------创建输入输出流
    private InputStream input =null;
    private OutputStream output = null;

    public SkClient(){
    //---------------------------------------------------概述窗口
    this.setSize(280,300);          //设置窗口大小
    this.setTitle("=客户端=");
    this.setVisible(true);          //设置窗口是否可见
    this.setLocationRelativeTo(null);   //窗口位置居中
    this.add("North",pl);           //边界布局,把面板容器放在北部
    this.add("Center", texta);      //把消息框放在中间
    label.setFont(new Font("宋体",Font.BOLD, 15));
    //------------------------------------------------设置聊天记录文本框
    texta.setBackground(Color.white);   //设置背景颜色
    texta.setFont(new Font("宋体", Font.BOLD, 12));//设置字体
    texta.setForeground(Color.green);   //设置字体颜色
    //--------------------------------------------------设置文本输入框
    pl.add(label);                  //添加标签到面板容器
    pl.add(textf);              //添加输入框到面板容器
    //---------------------------------------------------添加事件
    textf.addActionListener(this);
    addWindowListener(new WindowAdapter() {
        public void WindowClosing(WindowEvent e) 
        {
        //-----------------------------------程序结束

        System.exit(0);

        }
    });

    //--------------------------------------------------创建客户端与服务端的连接
    try {
        socket = new Socket("127.0.0.1",10006);//端口要没有被其他线程使用,否则accept不会阻塞
        texta.append("请求连接\n\n");
        input = socket.getInputStream();
        output = socket.getOutputStream();
        while(true){
        byte[] mess = new byte[256];
        input.read(mess);
        String inputMess = new String(mess);
        texta.append("服务端:"+inputMess);
        texta.append("\n\n");
        }


    } catch (Exception e) {

        System.err.println("服务端连接已经关闭\n");

    }

    }



    public static void main(String[] args){

    new SkClient();


    }

        //-------------------------------------------------发送消息给服务端
    public void actionPerformed(ActionEvent e) {
    try {
        String str = textf.getText();
        byte[] putMess = str.getBytes();         //获得文本框的输入信息
        output.write(putMess);                   //发送消息给给服务端端 
        textf.setText("");              //清空输入框
        texta.append("我:"+str);
        texta.append("\n\n");

    } catch (Exception e2) {

        System.out.println("失去连接");
    }



    }











}