服务端:

package NetWork;

import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Server implements ActionListener, Runnable {
JTextArea showArea;
JTextField msgText;
JFrame mainJframe;
JButton sentBtn;
JScrollPane JSPane;
JPanel pane;
Container con;
Thread thread = null;
ServerSocket serverSocket;
Socket connectToClient;
DataInputStream inFromClient;
DataOutputStream outToClient;

public Server() {
// 设置界面
mainJframe = new JFrame("TCP聊天服务端");
con = mainJframe.getContentPane();
showArea = new JTextArea();
showArea.setEditable(false);
showArea.setLineWrap(true);
JSPane = new JScrollPane(showArea);
msgText = new JTextField();
msgText.setColumns(30);
msgText.addActionListener(this);
sentBtn = new JButton("发送");
sentBtn.addActionListener(this);
pane = new JPanel();
pane.setLayout(new FlowLayout());
pane.add(msgText);
pane.add(sentBtn);
con.add(JSPane, BorderLayout.CENTER);
con.add(pane, BorderLayout.SOUTH);
mainJframe.setLocation(300, 200);
mainJframe.setSize(500, 350);
mainJframe.setVisible(true);
mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
;
try {
// 创建服务套接字
serverSocket = new ServerSocket(5500);
showArea.append("正在等待对话请求...\n");
// 侦听客户端的连接
connectToClient = serverSocket.accept();
inFromClient = new DataInputStream(connectToClient.getInputStream());
outToClient = new DataOutputStream(connectToClient.getOutputStream());
// 启动线程在后台来接收对方的消息
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
} catch (IOException e) {
showArea.append("对不起,不能创建服务器\n");
msgText.setEditable(false);
sentBtn.setEnabled(false);
}
}

public static void main(String[] args) {
new Server();
}

@Override // 响应按钮事件,发送消息给对方
public void actionPerformed(ActionEvent e) {
String s = msgText.getText();
if (s.length() > 0) {
try {
outToClient.writeUTF(s);
outToClient.flush();
showArea.append("我 :" + msgText.getText() + "\n");
msgText.setText(null);
} catch (IOException el) {
showArea.append("你的消息:“" + msgText.getText() + "”未能发出去!\n");
}
}
}

@Override
// 本线程负责将客户机传来的信息显示在对话区域
public void run() {
try {
while (true) {
showArea.append("客户端:" + inFromClient.readUTF() + "\n");
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

客户端:

package NetWork;

import java.io.*;
import java.net.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Client implements ActionListener, Runnable {
JTextArea showArea;
JTextField msgText;
JFrame mainJframe;
JButton sentBtn;
JScrollPane JSPane;
JPanel pane;
Container con;
Thread thread = null;
Socket connectToServer;
DataInputStream inFromServer;
DataOutputStream outToServer;

public Client() {
mainJframe = new JFrame("TCP聊天客户端");
con = mainJframe.getContentPane();
showArea = new JTextArea();
showArea.setEditable(false);
showArea.setLineWrap(true);
JSPane = new JScrollPane(showArea);
msgText = new JTextField();
msgText.setColumns(30);
msgText.addActionListener(this);
sentBtn = new JButton("发送");
sentBtn.addActionListener(this);
pane = new JPanel();
pane.setLayout(new FlowLayout());
pane.add(msgText);
pane.add(sentBtn);
con.add(JSPane, BorderLayout.CENTER);
con.add(pane, BorderLayout.SOUTH);
mainJframe.setLocation(700, 200);
mainJframe.setSize(500, 350);
mainJframe.setVisible(true);
mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建套接字连接到服务器
try {
connectToServer = new Socket("localhost", 5500); // 本地IP
inFromServer = new DataInputStream(connectToServer.getInputStream());
outToServer = new DataOutputStream(connectToServer.getOutputStream());
showArea.append("连接成功,请说话...\n");
// 创建线程在后台处理对方的消息
thread = new Thread(this);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
showArea.append("抱歉,未能连接到服务器!\n");
msgText.setEditable(false);
sentBtn.setEnabled(false);
}
}

public static void main(String[] args) {
new Client();
}

@Override //
public void actionPerformed(ActionEvent e) {
String s = msgText.getText();
if (s.length() > 0) {
try {
outToServer.writeUTF(s);
outToServer.flush();
showArea.append("我 : " + msgText.getText() + "\n");
msgText.setText(null);
} catch (IOException e1) {
showArea.append("你的消息:“" + msgText.getText() + "”未能发送出去!\n");
}
}
}

// 本线程负责将服务器传来的消息显示在对话区域
public void run() {
try {
while (true) {
showArea.append("服务端 :" + inFromServer.readUTF() + "\n");
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

结果展示:

java实现TCP通信(带界面)的更多相关文章

  1. Java 之 TCP 通信程序

    一.概述 TCP 通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server). 两端通信时步骤: 1.服务端程序,需要事先启动,等待客户端的连接: 2. ...

  2. java实现 TCP通信

    //服务端import com.hl.bluetooth.util.CRC16; import com.hl.bluetooth.util.FrameCheckFailedException; imp ...

  3. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示

    今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...

  5. 【Java】同步阻塞式(BIO)TCP通信

    TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...

  6. Java网络编程之TCP通信

    一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. Server ...

  7. 结对随即四则运算(带界面Java版)

    //随机四则运算类 public class 随机四则运算 { public static void main(String[] args) { new 界面();//进入随机四则运算的首界面 } } ...

  8. 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)

    基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...

  9. 【Java TCP/IP Socket】基于NIO的TCP通信(含代码)

    NIO主要原理及使用 NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接.读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候, ...

随机推荐

  1. 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集

    A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...

  2. Linux安装JAVA并且配置环境

    在写之前我先说一下我遇到的坑,我在配置环境的时候由于/etc/profile文件没有配置好导致系统彻底坏掉 1.ls vi等等命令使用不了,报错说找不到命令 2.在重启后虚拟机不能进入桌面 1.下载j ...

  3. Kernel RBD的QOS配置方案

    前言 关于qos的讨论有很多,ceph内部也正在实现着一整套的基于dmclock的qos的方案,这个不是本篇的内容,之前在社区的邮件列表看过有研发在聊qos的相关的实现的,当时一个研发就提出了在使用k ...

  4. nginx转发php文件到php-fpm服务器提示502错误

    实验将php文件转发给另一个php-fpm服务器处理的时候,出现了502错误: 检查了nginx错误日志,提示: 2019/08/25 17:54:56 [error] 4742#0: *35 rec ...

  5. 接入twitter第三方登陆接口遇到的一个问题

    本地开了 Shadowsocks,然后postman模拟的twitter的接口是请求成功的,然后用php-curl去请求网址,出现以下错误 Failed to connect to api.twitt ...

  6. [BUGCASE]FixedDataTable表格数据渲染错误

    一.问题描述 广告配置中绑定第三方规格ID表格数据,有一部分展示错乱,具体如下: 表格组件使用 Facebook 的 (fixed-data-table) 组件 二.原因分析 1.检查props 先查 ...

  7. 关于热力图的loss的一点感想

    网络的输出的热力图和gt相减的差矩阵,求其最大特征值的平方作为loss. 若图像h w不相等,可以使用奇异值代替特征值.奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关.每个矩阵A都可 ...

  8. C中memcpy函数用法

    1.函数原型 void *memcpy(void *destin,void *source,unsigned n); 其中, destin代表用于存储复制内容的目标数组,类型强制转换为void*指针. ...

  9. 最佳置换算法OPT

    原文链接:https://www.jianshu.com/p/544ee20e307c

  10. 第4.2节 神秘而强大的Python生成器精讲

    一. 生成器(generator)概念 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIte ...