java socket-2--即时通信
程序员文章站
2022-06-05 22:02:39
...
参照网上的一个视频做的即时通信
用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("失去连接");
}
}
}