本学期计算机网络课程要求完成一个TCP和一个UDP的通信程序,我完成了功能的简单实现,下面讲讲我的TCP程序的实现。(UDP的见另一篇博客)


目录

  • 效果展示
  • 一、项目结构
  • 二、完整代码
    • 1.TCPClient
    • 2.TCPClientFrame
    • 3.TCPServer
    • 4.TCPServerFrame
    • 5.TCPSend
    • 6.ReminderTextAdapter(参考别人的,非原创)
  • 总结

效果展示

以下是具体实现过程:

一、项目结构

下面说说每个类的具体作用:
TCPClient:TCP客户端的核心代码部分;
TCPClientFrame:TCP客户端的界面搭建;
TCPServer:TCP服务器端的核心代码部分;
TCPServerFrame:TCP服务器端的界面搭建;
TCPSend:客户端和服务器端发送信息的功能实现;
ReminderTextAdapter:网上查阅的代码,非核心内容实现部分,主要用于灰色提示字hint功能的实现(swing中的实现方法不太熟悉);

二、完整代码

1.TCPClient

代码如下:

package tcpCommunication;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;public class TCPClient implements ActionListener, Runnable {private TCPClientFrame clientFrame;private Socket socket;private Thread thread = null;private DataInputStream inFromServer;private DataOutputStream outToServer;public TCPClient() {JPanel panel = new JPanel();clientFrame = new TCPClientFrame("TCPClient");clientFrame.add(panel);clientFrame.placeComponents(panel);clientFrame.setVisible(true);clientFrame.getConnect().addActionListener(e -> {try {//host:"127.0.0.1"String host = clientFrame.getIpField().getText();//port:6666int port = Integer.parseInt(clientFrame.getPortField().getText());socket = new Socket(host, port);clientFrame.getTextArea().append("[Connect] : Connect…\n");inFromServer = new DataInputStream(socket.getInputStream());outToServer = new DataOutputStream(socket.getOutputStream());//new TCPSend(socket, "客户端").sendMessage();thread = new Thread(this);thread.setPriority(Thread.MIN_PRIORITY);thread.start();} catch (IOException ex) {ex.printStackTrace();}});clientFrame.getTransmit().addActionListener(this);System.out.println("TCP客户端准备就绪\n");}public static void main(String[] args) {new TCPClient();}//向服务器端发送数据@Overridepublic void actionPerformed(ActionEvent e) {String send = clientFrame.getSendField().getText();new TCPSend(send, outToServer, clientFrame.getTextArea(),"Client").sendMessages();}//使用线程处理客户端接收服务器端的数据@Overridepublic void run() {while (true) {try {clientFrame.getTextArea().append("[Server send] : " + inFromServer.readUTF() + "\n");Thread.sleep(100);} catch (IOException | InterruptedException e) {//e.printStackTrace();System.out.println("客户端与服务器连接中断\n");break;}}}
}

2.TCPClientFrame

代码如下:

package tcpCommunication;import udpCommunication.ReminderTextAdapter;import javax.swing.*;
import java.awt.*;public class TCPClientFrame extends JFrame {private static JTextField ipField;private static JTextField portField;private static JTextField sendField;private static JTextArea textArea;private static JButton connect;private static JButton transmit;public TCPClientFrame(String title) {setSize(700, 480);setLocationRelativeTo(null);//居中显示setResizable(false);//设置不允许改变窗体大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setTitle(title);}public JTextField getIpField() {return ipField;}public JTextField getPortField() {return portField;}public JTextField getSendField() {return sendField;}public JTextArea getTextArea() {return textArea;}public JButton getConnect() {return connect;}public JButton getTransmit() {return transmit;}public void placeComponents(JPanel panel) {panel.setLayout(null);Font font1 = new Font("宋体", Font.BOLD, 18);Font font2 = new Font("宋体", Font.PLAIN, 18);//创建JLabelJLabel ip = new JLabel("IP");ip.setFont(font1);//设置JLabel的字体ip.setBounds(105, 35, 120, 38);panel.add(ip);JLabel port = new JLabel("Port");port.setFont(font1);port.setBounds(105, 80, 120, 38);panel.add(port);JLabel send = new JLabel("Send");send.setFont(font1);send.setBounds(105, 125, 120, 38);panel.add(send);JLabel text = new JLabel("Text");text.setFont(font1);text.setBounds(105, 170, 120, 38);panel.add(text);//创建文本域ipField = new JTextField(30);ipField.setFont(font2);ipField.addFocusListener(new tcpCommunication.ReminderTextAdapter(ipField, "默认:127.0.0.1"));ipField.setBounds(180, 35, 380, 38);panel.add(ipField);portField = new JTextField(30);portField.setFont(font2);portField.addFocusListener(new ReminderTextAdapter(portField, "port:"));portField.setBounds(180, 80, 380, 38);panel.add(portField);sendField = new JTextField(30);sendField.setFont(font2);sendField.addFocusListener(new ReminderTextAdapter(sendField, "请输入要发送的信息:"));sendField.setBounds(180, 125, 380, 38);panel.add(sendField);textArea = new JTextArea();textArea.setFont(font2);textArea.setBounds(180, 170, 380, 170);textArea.setEditable(false);textArea.setLineWrap(false);panel.add(textArea);//给textArea添加滚动条JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(180, 170, 380, 170);scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);panel.add(scrollPane);scrollPane.setViewportView(textArea);//添加两个按钮connect = new JButton("连接");connect.setFont(font1);connect.setBounds(140, 360, 115, 40);panel.add(connect);transmit = new JButton("发送");transmit.setFont(font1);transmit.setBounds(440, 360, 115, 40);panel.add(transmit);}}

3.TCPServer

代码如下:

package tcpCommunication;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer implements ActionListener, Runnable {private TCPServerFrame serverFrame;private ServerSocket server;private Socket socket;private Thread thread = null;private DataInputStream inFromClient;private DataOutputStream outToClient;public TCPServer() {serverFrame = new TCPServerFrame("TCPServer");JPanel panel = new JPanel();serverFrame.add(panel);serverFrame.placeComponents(panel);serverFrame.setVisible(true);//port:6666serverFrame.getMonitor().addActionListener(e -> {try {int port = Integer.parseInt(serverFrame.getPortField().getText());server = new ServerSocket(port);serverFrame.getTextArea().append("[Listen] : Listen…\n");//获取客户端的socketsocket = server.accept();serverFrame.getTextArea().append("[Accept] : Accept OK.\n");inFromClient = new DataInputStream(socket.getInputStream());outToClient = new DataOutputStream(socket.getOutputStream());thread = new Thread(this);//创建子线程处理客户端输入信息//new TCPServerThread(socket).start();thread.setPriority(Thread.MIN_PRIORITY);thread.start();} catch (IOException ex) {ex.printStackTrace();}});serverFrame.getTransmit().addActionListener(this);System.out.println("TCP服务器准备就绪\n");}public static void main(String[] args) {new TCPServer();}//向客户端发送数据@Overridepublic void actionPerformed(ActionEvent e) {String send = serverFrame.getSendField().getText();new TCPSend(send, outToClient, serverFrame.getTextArea(),"Server").sendMessages();}//使用线程处理服务器端接收客户端的数据@Overridepublic void run() {while (true) {try {serverFrame.getTextArea().append("[Client send] : " + inFromClient.readUTF() + "\n");Thread.sleep(100);} catch (IOException | InterruptedException e) {//e.printStackTrace();System.out.println("服务器与客户端连接中断\n");break;}}}
}

4.TCPServerFrame

代码如下:

package tcpCommunication;import udpCommunication.ReminderTextAdapter;import javax.swing.*;
import java.awt.*;public class TCPServerFrame extends JFrame {private static JTextField portField;private static JTextField sendField;private static JTextArea textArea;private static JButton monitor;private static JButton transmit;public TCPServerFrame(String title) {setSize(700, 480);setLocationRelativeTo(null);//居中显示setResizable(false);//设置不允许改变窗体大小setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setTitle(title);}public JTextField getPortField() {return portField;}public JTextField getSendField() {return sendField;}public JTextArea getTextArea() {return textArea;}public JButton getMonitor() {return monitor;}public JButton getTransmit() {return transmit;}public void placeComponents(JPanel panel) {panel.setLayout(null);Font font1 = new Font("宋体", Font.BOLD, 18);Font font2 = new Font("宋体", Font.PLAIN, 18);//创建JLabelJLabel port = new JLabel("Port");port.setFont(font1);port.setBounds(105, 45, 120, 38);panel.add(port);JLabel send = new JLabel("Send");send.setFont(font1);send.setBounds(105, 100, 120, 38);panel.add(send);JLabel text = new JLabel("Text");text.setFont(font1);text.setBounds(105, 165, 120, 38);panel.add(text);//创建文本域portField = new JTextField(30);portField.setFont(font2);portField.addFocusListener(new ReminderTextAdapter(portField, "port:"));portField.setBounds(180, 45, 380, 38);panel.add(portField);sendField = new JTextField(30);sendField.setFont(font2);sendField.addFocusListener(new ReminderTextAdapter(sendField, "请输入要发送的信息:"));sendField.setBounds(180, 100, 380, 38);panel.add(sendField);textArea = new JTextArea();textArea.setFont(font2);textArea.setBounds(180, 160, 380, 170);textArea.setEditable(false);textArea.setLineWrap(false);panel.add(textArea);//给textArea添加滚动条JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(180, 160, 380, 170);scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);panel.add(scrollPane);scrollPane.setViewportView(textArea);//添加两个按钮monitor = new JButton("监听");monitor.setFont(font1);monitor.setBounds(140, 360, 115, 40);panel.add(monitor);transmit = new JButton("发送");transmit.setFont(font1);transmit.setBounds(440, 360, 115, 40);panel.add(transmit);}
}

5.TCPSend

代码如下:

package tcpCommunication;import javax.swing.*;
import java.io.DataOutputStream;
import java.io.IOException;public class TCPSend {private String send;private DataOutputStream dataOutputStream;private JTextArea textArea;private String sendObject;public TCPSend(String send, DataOutputStream dataOutputStream, JTextArea textArea, String sendObject) {this.send = send;this.dataOutputStream = dataOutputStream;this.textArea = textArea;this.sendObject = sendObject;}public void sendMessages() {if (send.length() > 0) {try {dataOutputStream.writeUTF(send);dataOutputStream.flush();textArea.append("\t\t     [" + sendObject + " send] : " + send + "\n");} catch (IOException ex) {textArea.append("Your message : “" + send + "”failed to send!\n");}}}}

6.ReminderTextAdapter(参考别人的,非原创)

代码如下:

package tcpCommunication;import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;public class ReminderTextAdapter extends FocusAdapter {//JTextField提示文字通用方法JTextField textField;String reminderString;//初始化public ReminderTextAdapter(JTextField textField, String reminderString) {this.textField = textField;this.reminderString = reminderString;}//焦点获得@Overridepublic void focusGained(FocusEvent e) {String tempString = textField.getText();//String tempString = this.getText();if (tempString.equals(reminderString)) {textField.setText("");textField.setForeground(Color.BLACK);}}//焦点失去@Overridepublic void focusLost(FocusEvent e) {String tempString = textField.getText();if (tempString.equals("")) {textField.setForeground(Color.GRAY);textField.setText(reminderString);}}}

总结

该项目简单的实现了TCP客户端和服务器端的通信,但是功能比较简单,页面也比较简洁,没有实现多个客户端互聊的功能等,还有待完善。


刚开始写博客,大家觉得不错的点个赞吧!如果大家有什么建议或者问题的,欢迎评论,我会尽量与大家探讨问题的。

Java实现简易TCP客户端、服务器端通信程序相关推荐

  1. Java多线程实现多客户端的通信

    title: Java多线程实现多客户端的通信 date: 2019-05-05 12:50:00 Java多线程实现多客户端的通信 昨天学了Java中网络支持Socket应用,写了一个基于TCP通信 ...

  2. 简易TCP客户端和服务端的实现

    文章目录 1 客户端的实现 2 服务端的实现 1 客户端的实现 用Socket API建立简易TCP客户端: 建立一个socket. 连接服务器 connect. 接收服务器信息 recv. 关闭so ...

  3. 多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言

    多路双向串口转网口上位机C++源代码带主动连接支持UDP和TCP客户端Socket通信C语言 使用说明介绍 1.功能介绍: 完成了多路网口和串口数据转换的功能. 可实现串口接收到的数据,通过网口发送出 ...

  4. Java实现简易UDP客户端、服务器端通信程序

    本学期计算机网络课程要求完成一个TCP和一个UDP的通信程序,我完成了功能的简单实现.我在上一篇博客已经讲了TCP的具体实现,接下来讲一讲UDP程序的实现. 目录 效果展示 一.项目结构 二.完整代码 ...

  5. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?

    我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...

  6. java搭建tcp客户端_【Java学习笔记】TCP客户端/服务器端

    客户端: import java.net.Socket; import java.net.InetAddress; import java.net.UnknownHostException; impo ...

  7. Java实现服务器和客户端简单通信

    Java中网络编程这一块有封装的类库,使用简单,了解原理可以教容易实现服务器和客户端的简单通信. 在编程之前,首先要需要对TCP/IP协议有一定的了解,需要知道Socket套接字的作用以及用法,这个可 ...

  8. 【Java】Socket多客户端Client-Server聊天程序

    文章目录 任务要求 实现代码 工具类 服务器端线程 客户端线程 服务器端程序 客户端程序 运行说明 任务要求 编写一个简单的Socket多客户端聊天程序: 客户端程序,从控制台输入字符串,发送到服务器 ...

  9. (二)TCP客户端/服务器通信------select函数

    (一)select函数 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它.也就是说,我们调用select告知内核对哪些描述符(就读.写或异常 ...

最新文章

  1. Java 8 开发的 4 大顶级技巧,你都知道吗 ?
  2. 《Spark大数据分析:核心概念、技术及实践》一3.6 惰性操作
  3. 青龙羊毛——旅游链(搬运,非原创)
  4. 在mac上搭建octopress+github pages博客
  5. 防火墙(15)——SNAT和DNAT,SNAT实践
  6. Office2016打开doc字符间距过小
  7. matlab产生一组均为一的矩阵,在matlab中如何从一组数中得到随机数组成一个n*n的矩阵...
  8. antd vue表单上传文件_vue+axios+antD的上传图片踩坑
  9. 1034. 二哥的金链
  10. 【十】推荐系统遇到知识图谱RippleNet
  11. mlag 堆叠_S-MLAG解决方案介绍
  12. (软件工程)用例说明模板
  13. 床位的摆放有五大禁忌
  14. MsSql 生成数据文档
  15. 查看Linux服务器架构是x86还是arm
  16. LeetCode#67--Add Binary(用Java实现二进制相加)
  17. (day 12 - 双指针)剑指 Offer 22. 链表中倒数第k个节点
  18. 原来大家最拼命的时候是这样子的。
  19. 压缩word文档大小的方法?
  20. php亲戚关系计算,亲戚计算器_亲戚称呼_亲戚关系称呼_亲戚关系计算器在线

热门文章

  1. 1小时学会Android基础
  2. 京东服务技术中台:你必须知道的全流程建设方法论!
  3. 2022年总结——实习
  4. MERRA2数据下载与后续处理
  5. 蓝桥杯 算法训练 自行车停放(Java)
  6. C++语言程序设计第四版课后答案(郑莉)
  7. 基于springboot音乐网站与分享平台
  8. Recuva 文件恢复工具
  9. 用户推广计划的规则及佣金计算
  10. 适合初学者的 Python3爬虫获取自如网北京租房数据