以流套接字连接形式实现的客户/服务器交互

本文介绍了一个基于Java的简单聊天室系统的设计与实现,包括服务器端与客户端的搭建过程。该系统采用Socket编程技术,实现了基本的文字消息传递功能。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

//服务器类
public class Server extends JFrame {
private static final long serialVersionUID = 1L;

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();

enterField = new JTextField();
enterField.setEditable(false);
enterField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
sendData(event.getActionCommand());//发送数据
enterField.setText("");
}
});

container.add(enterField, BorderLayout.NORTH);

displayArea = new JTextArea();
container.add(new JScrollPane(displayArea), BorderLayout.CENTER);

setSize(300, 150);
setVisible(true);
}

public void runServer() {
try {
server = new ServerSocket(12345, 100);// 建立一个服务器对象,端口12345,最多连接数100

while (true) {
waitForConnection();// 等待连接
getStreams();// 接收和发送字节
processConnection();//处理输入输出,进行通信
}
} catch (EOFException eofException) {
// TODO: handle exception
System.err.println("Server terminated connection");
}catch (IOException ioException) {
// TODO: handle exception
ioException.printStackTrace();
}
finally {
closeConnection();//关闭连接
++counter;
}
}

private void waitForConnection() throws IOException {
displayMessage("Waiting for connection/n");
connection = server.accept();// 监听客户的连接
displayMessage("Connection " + counter + " received from: "
+ connection.getInetAddress().getHostName());//得到客户机的名称
}

private void getStreams() throws IOException{
output=new ObjectOutputStream(connection.getOutputStream());//得到输出流
output.flush();//刷新缓冲区

input=new ObjectInputStream(connection.getInputStream());//得到输入流

displayMessage("/nGot I/O streams/n");
}

private void processConnection() throws IOException{
String message="Connection successful";
sendData(message);

setTextFieldEditable(true);

do {
try {
message=(String)input.readObject();//得到输入的信息
displayMessage("/n"+message);
} catch (ClassNotFoundException classNotFoundException) {
// TODO: handle exception
displayMessage("/nUnknow object type received");
}
} while (!message.equals("CLIENT>>>TERMINATE"));//terminate结束
}

private void closeConnection() {
displayMessage("/nTerminating connection/n");
setTextFieldEditable(false);

try {
output.close();
input.close();
connection.close();
} catch (IOException ioException) {
// TODO: handle exception
ioException.printStackTrace();
}
}

private void sendData(String message) {
try {
output.writeObject("SERVER>>>"+message);//写入数据
output.flush();
displayMessage("/nSERVER>>>"+message);
} catch (IOException ioException) {
// TODO: handle exception
displayArea.append("/nError writing object");
}
}

private void displayMessage(final String messageToDisplay) {
SwingUtilities.invokeLater(new Runnable() {//内部类,使得在线程中能够正确文本显示内容
public void run() {
displayArea.append(messageToDisplay);
displayArea.setCaretPosition(displayArea.getText().length());//将光标定位到最后一个字符后
}
});
}

private void setTextFieldEditable(final boolean editable) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
enterField.setEditable(editable);
}
});
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Server application=new Server();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.runServer();
}

}

package classWork;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

//客户类
public class Client extends JFrame {
private static final long serialVersionUID = 1L;

private JTextField enterField;
private JTextArea displayArea;
private ObjectOutputStream output;
private ObjectInputStream input;
private Socket client;
private String chatServer;
private String message="";

public Client(String host) {
super("Client");

chatServer=host;//服务器地址

Container container=getContentPane();

enterField=new JTextField();
enterField.setEditable(false);
enterField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
sendData(event.getActionCommand());
enterField.setText("");
}
});

container.add(enterField,BorderLayout.NORTH);

displayArea=new JTextArea();
container.add(new JScrollPane(displayArea),BorderLayout.CENTER);

setSize(300, 150);
setVisible(true);
}

private void runClient() {
try {
connectToServer();//创建套接字,准备连接
getStreams();
processConnection();
} catch (EOFException eofException) {
// TODO: handle exception
System.err.println("Client terminated connection");
}catch (IOException ioException) {
// TODO: handle exception
ioException.printStackTrace();
}

finally {
closeConnection();
}
}

private void connectToServer() throws IOException{
displayMessage("Attempting connection/n");

client=new Socket(InetAddress.getByName(chatServer),12345);//连接服务器

displayMessage("Connected to: "+client.getInetAddress().getHostName());
}

private void getStreams() throws IOException{
output=new ObjectOutputStream(client.getOutputStream());
output.flush();

input=new ObjectInputStream(client.getInputStream());

displayMessage("/nGot I/O streams/n");
}

private void processConnection() throws IOException{
setTextFieldEditable(true);

do {
try {
message=(String)input.readObject();
displayMessage("/n"+message);
} catch (ClassNotFoundException classNotFoundException) {
// TODO: handle exception
displayMessage("/nUnknow object type received");
}
} while (!message.equals("SERVER>>>TERMINATE"));
}

private void closeConnection() {
displayMessage("/nClosing connection");
setTextFieldEditable(false);

try {
output.close();
input.close();
client.close();
} catch (IOException ioException) {
// TODO: handle exception
ioException.printStackTrace();
}
}

private void sendData(String message) {
try {
output.writeObject("CLIENT>>> "+message);
output.flush();
displayMessage("/nCLIENT>>> "+message);
} catch (IOException ioException) {
// TODO: handle exception
displayArea.append("/nError writing object");
}
}

private void displayMessage(final String messageToDisplay) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
displayArea.append(messageToDisplay);
displayArea.setCaretPosition(displayArea.getText().length());
}
});
}

private void setTextFieldEditable(final boolean editable) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
enterField.setEditable(editable);
}
});
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Client application;

if(args.length==0)//如没有指定服务器IP,则与本地计算机进行通信,localhost,以进行测试
application=new Client("127.0.0.1");
else
application=new Client(args[0]);

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.runClient();
}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值