基于TCP协议的java单线程通信程序

这是大二学JAVA基础时写的一个小程序,通过在程序中设置主机IP和端口实现两台主机间的通信。由于当时对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.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MyServer {
JFrame frame;
JButton but;
JButton but1;
JTextField tf;
JTextArea ta;
JPanel pane;
BufferedReader br;
BufferedWriter bw;
public MyServer(){
frame=new JFrame("server");
but=new JButton("send");
but1=new JButton("close");
tf=new JTextField(15);
ta=new JTextArea(5,15);
JPanel pane=new JPanel();
pane.add(but);
pane.add(but1);
Container c=frame.getContentPane();
c.setLayout(new BorderLayout());
c.add(new JScrollPane(ta),BorderLayout.NORTH);
c.add(pane,BorderLayout.CENTER);
c.add(tf,BorderLayout.SOUTH);
frame.setSize(300, 200);
frame.setVisible(true);
ta.setEnabled(false);
/*

上面部分是界面设计的代码

*/
but.addActionListener(new ActionListener() {//给发送按钮添加事件监听器
public void actionPerformed(ActionEvent event){
try {
if(tf.getText()==null||tf.getText()=="")//判断用户有没有在文本框输入文本
{bw.newLine();//这是生成换行符,由于带有缓存的字符流(例如BufferedWriter)是以换行符作为每一行数据结束的标记,所以

如果没有这一行代码的话,客户端是收不到用户发送的信息的,直到服务器端结束运行。
bw.flush();//这句代码的意思是清空缓存,作用是使用户写入的信息能及时发送出去,由于用户没有输入文本,所以客户端收到的是空格
display("MySelf: " + tf.getText());//在显示框显示发送的信息
}
else
{
bw.write(tf.getText());
bw.newLine();
bw.flush();
display("MySelf: " + tf.getText());

}
tf.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
});

but1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);

}

});
}

public void display(String s){
ta.append(s + "\n");
ta.setCaretPosition(ta.getText().length());
tf.requestFocusInWindow();
}
public void run() throws Exception{
ServerSocket server=new ServerSocket(5000);//对端口5000进行监听
Socket s=server.accept();//开始监听服务
while(true){
bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(br.read()!=-1){
display("Client: " + br.readLine());
}
s.close();
}

}
public static void main(String[] args) throws Exception{
MyServer app=new MyServer();
app.run();

}

}

类二:客户端的代码,客户端代码和服务器端代码基本相同,只是服务器端多了ServerSocket server=new ServerSocket(5000);
Socket s=server.accept();这两句代码用于提供监听服务

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.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MyClient extends Thread{
JFrame frame;
JButton but;
JTextField tf;
JTextArea ta;
JPanel pane;
BufferedReader br;
BufferedWriter bw;
private JButton but1;
public MyClient(){
frame=new JFrame("Client");
but=new JButton("send");
but1=new JButton("close");
tf=new JTextField(15);
ta=new JTextArea(5,15);
JPanel pane=new JPanel();
pane.add(but);
pane.add(but1);
Container c=frame.getContentPane();
c.setLayout(new BorderLayout());
c.add(new JScrollPane(ta),BorderLayout.NORTH);
c.add(pane,BorderLayout.CENTER);
c.add(tf,BorderLayout.SOUTH);
frame.setSize(300, 200);
frame.setVisible(true);
ta.setEnabled(false);

but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event){
try {
if(tf.getText()==null||tf.getText()=="")
{bw.newLine();
bw.flush();
display("MySelf: " + tf.getText());
}
else
{
bw.write(tf.getText());
bw.newLine();
bw.flush();
display("MySelf: " + tf.getText());
}
tf.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
});

but1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);

}

});
}

public void display(String s){
ta.append(s + "\n");
ta.setCaretPosition(ta.getText().length());
tf.requestFocusInWindow();
}
public void run(){

Socket s;
try {
s = new Socket("localhost",5000);
while(true){
bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while(br.read()!=-1){
display("Server: " + br.readLine());
}
s.close();
}

} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) throws Exception{
MyClient app=new MyClient();
//
app.start();//app.run();
}

}

----------------------------------------------------------------------------------------------------------------------------------

由于这是一年前写的代码,现在对相关的知识只有大概的印象,对细节的东西的表述可能有偏差,欢迎大家纠错

时间: 2024-10-12 16:21:07

基于TCP协议的java单线程通信程序的相关文章

基于TCP协议的简单Socket通信笔记(JAVA)

好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. 1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下S

浅析C#基于TCP协议的SCOKET通信

TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. C#基于TCP协议的网络通讯 要进行C#基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

Java中的基于Tcp协议的网络编程

一:网络通信的三要素? IP地址     端口号     通信协议 IP地址:是网络中设备的通信地址.由于IP地址不易记忆,故可以使用主机名.本地环回地址,127.0.0.1   本地主机名localhost 端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数 字称为端口号.端口号是不同进程之间的标识.一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口. 通信协议:指定义的通信规则,这个规则

Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)

Android基础入门教程--7.6.3 基于TCP协议的Socket通信(2) 标签(空格分隔): Android基础入门教程 本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务

Learning-Python【28】:基于TCP协议通信的套接字

什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议. 所以,我们无需深入理解 TCP/UDP 协议,socket 已经为我们封装好了,我们只需要遵循 socket 的规定去编程,写出的程序自然就是遵循 TCP/UDP 标准的. 套接字的分类: 基于文件

python中基于tcp协议的通信(数据传输)

tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务端: fr

什么是 socket?简述基于 tcp 协议的套接字通信流程?

Socket的英文原义是"孔"或"插座".通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄, 可以用来实现不同虚拟机或不同计算机之间的通信. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 基于tcp 协议的套接字通信流程: 1). 服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听. 2). 用 bind