- 程序需求
客户端程序编写包括两部分,客户端界面和客户端通信线程。由于要使用图像化界面,所以网络通信的功能往往都是需要开新的线程来实现需求。
客户端需要实现往服务端发送消息的功能,并且可以记录服务端的反馈信息。
服务端程序需要实现一个持续提供服务的进程。接受客户端发送的信息,并反馈信息回客户端程序。 - 客户端界面
详细注释已经添加,注意查看注释标记的信息
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Client extends JFrame {
public static void main(String[] args){
new Client();
}
public Client(){
initFrame();
}
public void initFrame(){
this.setLayout(new BorderLayout());
this.setTitle("Client");
this.setDefaultLookAndFeelDecorated(true);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setBounds(600,300,500,200);
JPanel jPanel=new JPanel();
jPanel.setLayout(new FlowLayout());
JTextField jTextField_1=new JTextField(31);
JButton jButton=new JButton("发送");
JTextArea jTextArea=new JTextArea();
jTextArea.setEditable(false);
jTextArea.setLineWrap(true);
jTextArea.setWrapStyleWord(true);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(!jTextField_1.getText().equals("")){
Thread thread=new ClientThread(jTextField_1,jTextArea);
thread.start();
}
}
});
JScrollPane jScrollPane=new JScrollPane(jTextArea);
jScrollPane.setPreferredSize(new Dimension(460,100));
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jPanel.add(jTextField_1);
jPanel.add(jButton);
jPanel.add(jScrollPane);
this.add(jPanel,BorderLayout.CENTER);
this.setVisible(true);
}
}
- 客户端socket网络通信线程
import javax.swing.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientThread extends Thread{
JTextField jTextField;
JTextArea jTextArea;
public ClientThread(JTextField jTextField,JTextArea jTextArea){
this.jTextField=jTextField;
this.jTextArea=jTextArea;
}
@Override
public void run() {
String readLine = "default";
String inTemp = null;
String turnLine = "\n";
final String client = "Client:";
final String server = "Server:";
int port = 4000;
byte ipAddressTemp[] = {127, 0, 0, 1};
try{
readLine=jTextField.getText();
jTextField.setText("");
InetAddress ipAddress = null;
ipAddress = InetAddress.getByAddress(ipAddressTemp);
Socket socket = null;
socket = new Socket(ipAddress, port);
BufferedReader socketIn = null;
socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter socketOut = null;
socketOut = new PrintWriter(socket.getOutputStream());
socketOut.println(readLine);
socketOut.flush();
inTemp=socketIn.readLine();
if(inTemp!=null){
jTextArea.append(inTemp+"\n");
}
socketIn.close();
socketOut.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 服务端程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
String readline=null;
String inTemp=null;
int port=4000;
ServerSocket serverSocket=new ServerSocket(port);
while(true) {
Socket socket=serverSocket.accept();
BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
inTemp=socketIn.readLine();
if(inTemp!=null&&inTemp.equals("bye")){
socketIn.close();
socketOut.close();
socket.close();
break;
}
else if(inTemp!=null&&!inTemp.equals("")&&!inTemp.equals("null")){
InetAddress inetAddress=socket.getInetAddress();
String ip=inetAddress.getHostAddress();
int clientPort=socket.getPort();
System.out.println("内容为:"+inTemp+"\n"+"ip:"+ip+"\n"+"clientPort:"+clientPort);
readline="server收到了!";
socketOut.println(readline+inTemp);
socketOut.flush();
}
socketIn.close();
socketOut.close();
socket.close();
}
serverSocket.close();
}
}
- 运行结果