一、具体要求
图形界面编程,利用socket和UDP/TCP编写,客户端和服务端程序可以进行多次对话。
二、源代码
1.ServerDemo.java
package myInternet_3;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;
import java.awt.Color;
import javax.swing.JScrollPane;
public class ServerDemo extends JFrame {
private JPanel contentPane;
public JTextArea textField ;
private JScrollPane scrollPane ;
public JTextField textField_1;
public JButton button = new JButton("发 送");
private boolean flag=false;
/**
* Launch the application.
*/
/*public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ServerDemo frame = new ServerDemo();
frame.setVisible(true);
ServerSocket server=null;
try{
server=new ServerSocket(4444);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
server.close(); //关闭ServerSocket
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
*/
/**
* Create the frame.
*/
public ServerDemo() {
setTitle("ServerDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel label_1 = new JLabel("对话内容:");
label_1.setBounds(30, 10, 80, 15);
contentPane.add(label_1);
/*JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(30, 172, 376, -130);
contentPane.add(scrollPane);
*/
scrollPane = new JScrollPane();
scrollPane.setBounds(30, 37, 376, 144);
contentPane.add(scrollPane);
textField = new JTextArea();
textField.setBounds(30, 37, 376, 144);
textField.setEditable(false);
scrollPane.setViewportView(textField);
//contentPane.add(textField);
JLabel label = new JLabel("请输入您要发送的消息:");
label.setBounds(30, 191, 146, 15);
contentPane.add(label);
textField_1 = new JTextField();
textField_1.setBounds(172, 188, 221, 21);
contentPane.add(textField_1);
textField_1.setColumns(10);
/*
//更新消息框
ServerSocket serverSocket=null;
Socket clientSocket=null;
String str=null;
try {
serverSocket=new ServerSocket(5555);
clientSocket=serverSocket.accept();
DataInputStream in=new DataInputStream(clientSocket.getInputStream());
//DataOutputStream out=new DataOutputStream(clientSocket.getOutputStream());
str=in.readUTF();
textField.setText(textField.getText()+"\n"+"(对方)"+str);
//str=textField_1.getText();
//out.writeUTF(str);
//textField.setText(textField.getText()+"\n"+"(自己)"+str);
}catch (Exception exception) {
System.out.println(exception.getMessage());
}
*/
/*button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
flag=true;
}
});*/
button.setBounds(66, 228, 93, 23);
contentPane.add(button);
JButton btnNewButton = new JButton("清 除");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField_1.setText("");
}
});
btnNewButton.setBounds(242, 228, 93, 23);
contentPane.add(btnNewButton);
}
public JTextArea get() {
return this.textField;
}
public JTextField get_1() {
return this.textField_1;
}
public boolean getFlag() {
return this.flag;
}
public void revise() {
this.flag=false;
}
}
2.Server.java
package myInternet_3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.text.SimpleDateFormat;
public class Server extends Thread{
private ServerDemo serverFrame;
public void run() {
ServerSocket serverSocket=null;
Socket clientSocket=null;
String str=null;
serverFrame = new ServerDemo();
serverFrame.setVisible(true);
try {
serverSocket=new ServerSocket(60002);
clientSocket=serverSocket.accept();
serverFrame.textField.setText("有客户连接成功!"+"\r\n");
DataInputStream in=new DataInputStream(clientSocket.getInputStream());
DataOutputStream out=new DataOutputStream(clientSocket.getOutputStream());
out.writeUTF("连接成功!");
serverFrame.button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(serverFrame.textField_1.getText().equals("")==false) {
if(serverFrame.textField.getText()!=null) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
serverFrame.textField.setText(serverFrame.textField.getText()+"服务端:"+s+"\r\n"+" "+serverFrame.textField_1.getText()+"\r\n");
}
else {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
serverFrame.textField.setText("服务端:"+s+"\r\n"+" "+serverFrame.textField_1.getText()+"\r\n");
}
try{
out.writeUTF(serverFrame.textField_1.getText());
}catch (Exception exception) {
System.out.println(exception.getMessage());
}
serverFrame.textField_1.setText("");
}
}
});
while(true) {
str=in.readUTF();
if(str.equals("")==false) {
if(serverFrame.textField.getText()!=null) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
serverFrame.textField.setText(serverFrame.textField.getText()+"客户端:"+s+"\r\n"+" "+str+"\r\n");
}
else {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
serverFrame.textField.setText("客户端:"+s+"\r\n"+" "+str);
}
}
//out.writeUTF(serverFrame.textField_1.getText());
}
//in.close();
//out.close();
//clientSocket.close();
//serverSocket.close();
}catch (Exception exception) {
System.out.println(exception.getMessage());
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}
3.ClientDemo.java
package myInternet_3;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;
public class ClientDemo extends JFrame {
private JPanel contentPane;
public JTextArea textField ;
private JScrollPane scrollPane ;
public JTextField textField_1;
public JButton button = new JButton("发 送");
private boolean flag=false;
/**
* Launch the application.
*/
/*public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ClientDemo frame = new ClientDemo();
frame.setVisible(true);
Socket socket=new Socket("127.0.0.1", 4444);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine();
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine();
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
} catch (Exception e) {
e.printStackTrace();
}
}
});
}*/
/**
* Create the frame.
*/
public ClientDemo() {
setTitle("ClientDemo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel label = new JLabel("对话内容:");
label.setBounds(26, 10, 69, 15);
contentPane.add(label);
scrollPane = new JScrollPane();
scrollPane.setBounds(26, 30, 379, 142);
contentPane.add(scrollPane);
textField = new JTextArea();
textField.setBounds(26, 30, 379, 142);
scrollPane.setViewportView(textField);
//contentPane.add(textField);
JLabel label_1 = new JLabel("请输入你要发送的消息:");
label_1.setBounds(26, 192, 149, 21);
contentPane.add(label_1);
textField_1 = new JTextField();
textField_1.setBounds(185, 192, 193, 21);
contentPane.add(textField_1);
textField_1.setColumns(10);
button.setBounds(65, 223, 93, 23);
contentPane.add(button);
JButton button_1 = new JButton("清 除");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField_1.setText("");
}
});
button_1.setBounds(230, 223, 93, 23);
contentPane.add(button_1);
}
public JTextArea get() {
return this.textField;
}
public JTextField get_1() {
return this.textField_1;
}
public boolean getFlag() {
return this.flag;
}
public void revise() {
this.flag=false;
}
}
4.Client.java
package myInternet_3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Client extends Thread{
private ClientDemo clientFrame;
public void run() {
Socket client=null;
String fromServer=null;
clientFrame=new ClientDemo();
clientFrame.setVisible(true);
try {
client=new Socket("127.0.0.1",60002);
DataOutputStream out=new DataOutputStream(client.getOutputStream());
DataInputStream in=new DataInputStream(client.getInputStream());
clientFrame.button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(clientFrame.textField_1.getText().equals("")==false) {
if(clientFrame.textField.getText()!=null) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
clientFrame.textField.setText(clientFrame.textField.getText()+"客户端:"+s+"\r\n"+" "+clientFrame.textField_1.getText()+"\r\n");
}
else {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
clientFrame.textField.setText("客户端:"+s+"\r\n"+" "+clientFrame.textField_1.getText()+"\r\n");
}
try{
out.writeUTF(clientFrame.textField_1.getText());
}catch (Exception exception) {
System.out.println(exception.getMessage());
}
clientFrame.textField_1.setText("");
}
}
});
while(true) {
fromServer=in.readUTF();
if(fromServer.equals("")==false)
{
if(fromServer.equals("连接成功!")==true)
clientFrame.textField.setText("连接成功!"+"\r\n");
else {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String s = simpleDateFormat.format(date);
clientFrame.textField.setText(clientFrame.textField.getText()+"服务端:"+s+"\r\n"+" "+fromServer+"\r\n");
}
}
}
//out.close();
//in.close();
//client.close();
}catch(Exception exception) {
System.out.println(exception.getMessage());
}
}
public static void main(String[] args) {
Client client=new Client();
client.start();
}
}
三、体会
网络编程这一块本身是较为简单的,但是需要结合多线程和界面设计时会变得比较麻烦,因此,在编程前应当想清楚类的关系,线程的数量及关系;另外,网络编程应用十分广阔,应该要学得扎实。
四、说明
刚开始写这个代码的时候,线程之间的关系没有考虑清楚(即注释部分里面的),后来/…/内的没有删除。