📄 server.java
字号:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Server extends JFrame {
private JTextField enterField;
private JTextArea displayArea;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
private int counter = 1;
//服务端构造函数
public Server()
{
super( "服务端Server" );
Container container = getContentPane();
// 建立消息显示区域
displayArea = new JTextArea();
container.add( new JScrollPane( displayArea ),
BorderLayout.CENTER );
// 建立一个单文行发送消息到客户端
enterField = new JTextField();
enterField.setEnabled( false );
enterField.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent event )
{
sendData( event.getActionCommand() );
}
}
);
container.add( enterField, BorderLayout.SOUTH );
setSize( 400, 300 );
setVisible( true );
}
// 运行服务端
public void runServer()
{
try {
// 建立一个ServerSocket对象提供TCP/IP服务
server = new ServerSocket( 5000);
while ( true ) {
// 等待连接
waitForConnection();
// 获得输入输出流
getStreams();
// 连接过程
processConnection();
// 关闭连接
closeConnection();
++counter;
}
}
// 当客户端关闭连接时给出提示
catch ( EOFException eofException ) {
System.out.println( "客户端关闭了连接" );
}
// 捕获I/O异常
catch ( IOException ioException ) {
ioException.printStackTrace();
}
}
// wait for connection to arrive, then display connection info
private void waitForConnection() throws IOException
{
displayArea.setText( "等待连接....\n" );
// 接到连接请求,建立一条TCP连接,然后创建一个Socket的对象connection与客户端通信
connection = server.accept();
displayArea.append( "收到" + counter +
" 请求连接从:" +
connection.getInetAddress().getHostName() );
}
// 获取输入输出流,准备接受信息
private void getStreams() throws IOException
{
output = new ObjectOutputStream(
connection.getOutputStream() );
output.flush();
input = new ObjectInputStream(
connection.getInputStream() );
displayArea.append( "\n获得输入输出流\n" );
}
// 与客户端的连接过程
private void processConnection() throws IOException
{
// 发送一个连接成功的信息给客户端
String message = "服务器返回消息: 连接服务器成功!";
output.writeObject( message );
output.flush();
// 使发送消息区域能编辑
enterField.setEnabled( true );
// 接受从客户端发送的信息
do {
// 读取信息并在 displayArea上显示消息
try {
message = ( String ) input.readObject();
displayArea.append( "\n" + message );
displayArea.setCaretPosition(
displayArea.getText().length() );
}
// 捕获客户端的异常
catch ( ClassNotFoundException classNotFoundException ) {
displayArea.append( "\nUnknown object type received" );
}
} while ( !message.equals( "客户端:离线" ) );
}
//关闭输入输出流和TCP连接
private void closeConnection() throws IOException
{
displayArea.append( "\n客户端离线了!" );
enterField.setEnabled( false );
output.close();
input.close();
connection.close();
}
// 发送消息到客户端
private void sendData( String message )
{
try {
output.writeObject( "服务端说:" + message );
output.flush();
displayArea.append( "\n服务端说:" + message );
}
catch ( IOException ioException ) {
displayArea.append( "\nError writing object" );
}
}
// 服务端主函数
public static void main( String args[] )
{
Server application = new Server();
application.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
application.runServer();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -