概述:通过网络编程来实现聊天室功能
第一步:建立服务端与客户端并建立连接
服务端:
import java.io.IOException;
import java.net.ServerSocket;
public class Server {
ServerSocket server;
public Server() {
try {
server=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
System.out.println("等待连接...");
server.accept();
System.out.println("连接成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}
客户端:
import java.io.IOException;
import java.net.Socket;
public class Client {
Socket socket;
public Client() {
try {
socket=new Socket("localhost",8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client=new Client();
}
}
注:输出语句为了测试连接,服务端的端口号范围为05-29775,且运行时需先运行服务端后再运行客户端。
第二步:既然要做聊天室,那就必须上点档次,如果只是在控制台进行输入输出,那也太low了,所以我们可以将客户端做成一个有消息显示框与消息输入框的窗体,但是服务端是没有必要的,因为服务端仅仅起到了一个转发的功能,所以服务端是否窗体化并不重要。
客户端:
import java.awt.BorderLayout;
import java.io.IOException;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Client extends JFrame{
private Socket socket;
private JPanel panel;
private JTextArea MsgShow;
private JTextArea MsgSend;
public Client() {
try {
socket=new Socket("localhost",8888);
panel=new JPanel();
MsgShow=new JTextArea(15,42);
MsgSend=new JTextArea(5,42);
inIt();
} catch (IOException e) {
e.printStackTrace();
}
}
public void inIt() {
this.setSize(500,415);//设置窗体大小
this.setLocationRelativeTo(null);//窗体居中
this.setResizable(false);//设置窗体不可拉伸
this.setLayout(new BorderLayout());//设置窗体布局
this.add(panel,BorderLayout.CENTER);//将面板添加到窗体中
//给信息显示与发送区域添加滚动条
JScrollPane jspMsgShow=new JScrollPane(MsgShow);
JScrollPane jspMsgSend=new JScrollPane(MsgSend);
//设置垂直滚动条,常数VERTICAL_SCROLLBAR_ALWAYS:始终垂直滚动
jspMsgShow.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jspMsgSend.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//设置信息显示区为不可编辑
MsgShow.setEditable(false);
//设置信息输入区行满自动换行
MsgSend.setLineWrap(true);
//将信息显示与发送区添加至面板中
panel.add(jspMsgShow);
panel.add(jspMsgSend);
//设置窗体关闭即退出
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
this.setVisible(true);
}
}
注:若要关闭程序,仅关闭客户端窗口是不可以的,需要在程序控制台处将客户端与服务端全部关闭。
第三步:为信息编辑区添加键盘事件,使得在信息编辑完后点击回车键释放回车键之后信息发送至服务器端,然后将文本输入区域内的数据清空,由此我们可知,第一,需要添加键盘事件,第二,需要信息发送方法
客户端:
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Client extends JFrame{
public void start() {
KeyListener key=new KeyAdapter() {
public void keyReleased(KeyEvent e) {
String str=sendMsg.getText();
if(e.getKeyCode()==KeyEvent.VK_ENTER) {
sendMessage(str);
}
}
};
sendMsg.addKeyListener(key);
}
public void sendMessage(String str) {
if(str==""||str.trim().length()==0) {
return;
}
try {
PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"),true);
str=str.trim();
pw.println(str);
sendMsg.setText("");
} catch (IOException e) {
e.printStackTrace();
}
sendMsg.setText("");
}
public static void main(String[] args) {
Client client=new Client();
client.start();
}
}
第四步:现在客户端的信息可以发送给客户端,如果想要信息显示在客户端接受信息处,那就需要服务端接收到客户端发来的信息之后再发送至客户端后客户端再将信息显示在信息显示处
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
ServerSocket server;
public Server() {
try {
server=new ServerSocket(8888);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
try {
Socket socket=server.accept();
System.out.println("连接成功!");
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
PrintWriter pw=new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"),true);
String Read="";
while((Read=br.readLine())!=null) {
pw.println(Read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}
客户端:
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Client extends JFrame{
private Socket socket;
private JPanel panel;
private JTextArea showMsg;
private JTextArea sendMsg;
public Client() {
try {
socket=new Socket("localhost",8888);
panel=new JPanel();
showMsg=new JTextArea(15,42);
sendMsg=new JTextArea(5,42);
inIt();
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
KeyListener key=new KeyAdapter() {
public void keyReleased(KeyEvent e) {
String str=sendMsg.getText();
if(e.getKeyCode()==KeyEvent.VK_ENTER) {
sendMessage(str);
}
}
};
sendMsg.addKeyListener(key);
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
String backMsg="";
while((backMsg=br.readLine())!=null) {
showMsg.append(backMsg+"\n");
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
public static void main(String[] args) {
Client client=new Client();
client.start();
}
}