实验七 聊天网络程序设计实验
一、实验目的
练习基于Socket的网络访问方法,理解TCP/IP传输层网络程序的设计思想与实现方法。
二、实验内容
设计通过网络进行聊天的Java应用程序,实现如下功能:
(1)聊天两端具有相同的界面,包括能输入消息的文本框、发送消息按钮、消息列表文本框;
(2)任意一端均可以实时发送和接收消息,并在自身的消息列表中显示消息记录。三、实验设计
(反映设计原理、设计方法、设计过程、设计结果)
1:首先要完成这项设计需要两个端口,客户端和服务器端,在这里面设计两个端口,写代码。
2:在用户端口上设计用户界面,这里首先需要一个文本框,来输入传输的内容,然后点击“发送消息”,客户端程序需要界面,服务器端只起到连接客户和转发信息的作用,因此不需要界面。
3:然后设置服务器端,设置服务器地址信息,并将监听端口绑定到这个地址上。
4:编写代码,进行客户端与服务器端连接。这样就实现了整个设计过程
四、实验过程
(反映实验的基本过程,重点体现实验中遇到的问题和解决方案)
1:客户端的实现,将文本框中的信息,通过点击“发送信息”按钮,启动监听功能,发送到服务器端,服务器端接受信息,并且将另外的信息返回到用户端,实现用户端与服务器端的信息交流。
客户端实现过程:
服务期端的连接 实现:
五、实验结果
1:先启动服务器,直接点击运行服务器端口的代码就行。
2:然后运行客户端,如果连接成功就会出现客户端的界面并且显示连接成功,在显示结果的地方。
3:在客户端的文本框中输入想要发送的内容,任意输入都可以。
4:点击“发送消息”。就会出现在客户端里面,这样就完后曾了整个聊天过程。
七、附录:关键代码(给出适当注释,可读性高)
package exam7;
import java.awt.EventQueue;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ChatClient {
private JFrame frame;
static JTextArea txt_accept;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatClient window = new ChatClient();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
try {
Socket socket = new Socket("127.0.0.1",8080);//连接端口
System.out.println("Connection Succeed");
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while(true) {
String s= dis.readUTF();
txt_accept.setText(s);
}
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
System.out.println("UnkonwHostException...");
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println("IOException...");
}
}
/**
* Create the application.
*/
public ChatClient() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JTextArea txt_send = new JTextArea();
txt_send.setBounds(27, 28, 195, 56);
frame.getContentPane().add(txt_send);
JButton btnSendMessage = new JButton("\u53D1\u9001\u6D88\u606F");
btnSendMessage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
btnSendMessage.setBounds(261, 28, 167, 48);
frame.getContentPane().add(btnSendMessage);
txt_accept = new JTextArea();
txt_accept.setBounds(29, 121, 340, 120);
frame.getContentPane().add(txt_accept);
}
}
package exam7;
import java.awt.EventQueue;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;
public class ChatServer {
private JFrame frame;
static Socket socket ;
JTextArea txt_Send;
private JTextArea textArea;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatServer window = new ChatServer();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
try {
ServerSocket ss = new ServerSocket(8080);
socket = ss.accept();
System.out.println("Host Connected");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
/**
* Create the application.
*/
public ChatServer() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JButton btnSendMessage = new JButton("\u53D1\u9001\u6D88\u606F");
btnSendMessage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
String s = txt_Send.getText();
try {
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
btnSendMessage.setBounds(267, 40, 129, 48);
frame.getContentPane().add(btnSendMessage);
txt_Send = new JTextArea();
txt_Send.setBounds(32, 35, 223, 58);
frame.getContentPane().add(txt_Send);
textArea = new JTextArea();
textArea.setBounds(32, 136, 328, 103);
frame.getContentPane().add(textArea);
}
}
注:每个部分根据情况可以再分子标题,前提是层次清晰、逻辑性强。