又是一天JAVA作业:使用swing编写一个服务器和客户端程序。在他们之间实现TCP通信。程序启动后,客户端程序在窗口的文本框中输入内容。点击发送按钮时向服务器端发送文本框中的文本。服务器端收到信息后。反馈 ok。并在客户端窗口显示。
根据Socket握手原则,握手肯定有双方的手呀,那么简单的道理就用简单代码实现。
简单上代码吧,不难实现。
简单分为两个部分:服务器程序和客户端程序
分别是GetTCP和SendTCP
SentTCP.java
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.border.BevelBorder;
//1、使用swing编写一个服务器和客户端程序。在他们之间实现TCP通信。程序启动后,客户端程序在窗口的文本框中输入内容。点击发送按钮时向服务器端发送文本框中的文本。
//服务器端收到信息后。反馈 ok。并在客户端窗口显示。
public class SentTCP extends JFrame{
private PrintWriter writer;
Socket socket;
private JTextArea ta = new JTextArea();
private JTextField tf = new JTextField();
Container cc;
public SentTCP(String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //结束窗口所在的应用程序。在窗口被关闭的时候会退出JVM
cc=this.getContentPane();
final JScrollPane scrollPane=new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane,BorderLayout.CENTER);
scrollPane.setViewportView(ta);
cc.add(tf,"South");
tf.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
writer.println(tf.getText()); //将文本框中的信息写入流
ta.append(tf.getText()+"\n"); //将文本框中的信息显示在文本域中
ta.setSelectionEnd(ta.getText().length());
tf.setText(""); //将文本框清空
}
//绑定事件
});
}
private void connect() {
// TODO Auto-generated method stub
ta.append("尝试与服务器连接\n");
try {
socket = new Socket("127.0.0.1",8998);
writer = new PrintWriter(socket.getOutputStream(),true);
ta.append("完成连接\n");
}catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SentTCP tcp = new SentTCP("向服务器发送数据");
tcp.setSize(200,200);
tcp.setVisible(true);
tcp.connect();
}
}
GetTCP.java
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.*;
import javax.swing.border.BevelBorder;
public class GetTCP extends JFrame{
private BufferedReader reader;
private ServerSocket server;
private Socket socket;
Container cc;
private PrintWriter writer;
private JTextArea ta = new JTextArea();
public GetTCP() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //结束窗口所在的应用程序。在窗口被关闭的时候会退出JVM
cc=this.getContentPane();
final JScrollPane scrollPane=new JScrollPane();
scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
getContentPane().add(scrollPane,BorderLayout.CENTER);
scrollPane.setViewportView(ta);
}
void getServer() {
try {
server = new ServerSocket(8998);//实例化Socket对象
ta.append("服务器套接字已经创建成功\n");
while(true) {//如果套接字是连接状态
ta.append("等待客户机的连接\n");
socket=server.accept();//实例化socket对象
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//实例化bufferedReader对象
getClientMessage();
}
}catch(Exception e) {
e.printStackTrace();
}
}
private void getClientMessage() {
// TODO Auto-generated method stub
try {
while(true) {//如果套接字段是连接状态
ta.append("客户机:"+reader.readLine()+"\n");
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(reader!=null) {
reader.close();//关闭流
}
if(socket!=null) {
socket.close();//关闭套字
}
}catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
GetTCP tcp = new GetTCP();
tcp.setSize(300,300);
tcp.setVisible(true);
tcp.getServer();
}
}
实现老师的要求就在这里了,大家可以根据具体要求细化代码。