tcp通讯程序 java,Java基于TCP的通讯程序

本文详细介绍了如何使用Java实现基于TCP的客户端和服务器端通信。从创建Socket和ServerSocket对象,到建立连接、读写数据及关闭资源的步骤,展示了Java网络编程的基础知识。同时,通过示例代码演示了单个客户端与服务器交互,以及服务器处理多个客户端连接的情况,涉及到了多线程的应用。
摘要由CSDN通过智能技术生成

原标题:Java基于TCP的通讯程序

3e719be5910c201c19eba8e7f8b9db4e.png

为了更好的帮助大家便利的学习java这门编程语言,和更好的巩固java语言学习中的基础知识,我们特意为大家精心制作了java程序设计精编教程。

本教程精选java核心内容,结合实例,循序渐进的向大家介绍Java语言。以零基础讲解为基础,用实例引导大家学习,深入浅出的向大家介绍java的相关知识和实战技能。

Java入门(43)

1.基于TCP的通讯程序

1.1客户端

java.net 类 Socket---类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

构造方法摘要

Socket 通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddress address, int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

Socket(String host, int port)创建一个流套接字并将其连接到指定主机上的指定端口号。

InputStream getInputStream返回此套接字的输入流。收

OutputStream getOutputStream返回此套接字的输出流。发

InetAddress getInetAddress 返回套接字连接的地址。

int getPort 返回此套接字连接到的远程端口。

void close关闭此套接字。

1.2服务器端

java.net 类 ServerSocket---此类实现服务器套接字

构造方法摘要

ServerSocket(int port) 创建绑定到特定端口的服务器套接字。

方法摘要

Socket accept侦听并接受到此套接字的连接。

void close 关闭此套接字。

1d49cd191d8a4019dc32615887332bfd.png

客户端的创建步骤:

1.得到客户端需要链接的服务器端的IP地址,得到端口号。

2.使用Socket(InetAddress address, int port) /Socket(String host, int port)创建客户端对象

3.通过创建客户端对象Socket对象调用getInputStream/getOutputStream创建收发数据的输入流/输出流对象。

4.使用创建收发数据的输入流/输出流对象,调用read/write方法完成数据的收发。

5.关闭流和客户端对象。

服务器端的创建步骤:

1、指定端口号,与客户端需要链接的服务器端的端口号相同。

2、使用ServerSocket(int port)创建服务器端对象。

3、使用创建服务器端对象调用accept接收链接到服务器的客户端对象。

4、使用链接到服务器的客户端对象调用getInputStream/getOutputStream创建收发数据的输入流/输出流对象。

5、使用创建收发数据的输入流/输出流对象,调用read/write方法完成数据的收发。

6、关闭流和客户端对象与服务器端对象。

例如1:客户端向服务器端发送“hello,你好”,服务器端接收到客户端发来的“hello,你好”

package com.click369.test1;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

/**

* 客户端的创建步骤:

1.得到客户端需要链接的服务器端的IP地址,得到端口号。

2.使用Socket(InetAddress address, int port) /Socket(String host, int port)创建客户端对象

3.通过创建客户端对象Socket对象调用getInputStream/getOutputStream创建收发数据的输入流/输出流对象。

4.使用创建收发数据的输入流/输出流对象,调用read/write方法完成数据的收发。

5.关闭流和客户端对象。

* @author Administrator

*

*/

public class TcpClient1 {

public static void main(String[] args)throws Exception {

//1.得到客户端需要链接的服务器端的IP地址,得到端口号。

InetAddress serverip=InetAddress.getLocalHost;

int serverport=3000;

//2.使用Socket(InetAddress address, int port)创建客户端对象

Socket client=new Socket(serverip,serverport);

//3.通过创建客户端对象Socket对象调用getOutputStream创建收发数据的输入流/输出流对象。

OutputStream out=client.getOutputStream;

System.out.println("请输入需要发送的数据:");

BufferedReader read=new BufferedReader(new InputStreamReader(System.in));

String info=read.readLine;

//4.使用创建收发数据的输出流对象,调用write方法完成数据的发。

out.write(info.getBytes);

//5.关闭流和客户端对象。

out.close;

client.close;

}

}

package com.click369.test1;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

* 服务器端的创建步骤:

1、指定端口号,与客户端需要链接的服务器端的端口号相同。

2、使用ServerSocket(int port)创建服务器端对象。

3、使用创建服务器端对象调用accept接收链接到服务器的客户端对象。

4、使用链接到服务器的客户端对象调用getInputStream/getOutputStream创建收发数据的输入流/输出流对象。

5、使用创建收发数据的输入流/输出流对象,调用read/write方法完成数据的收发。

6、关闭流和客户端对象与服务器端对象。

* @author Administrator

*

*/

public class TcpServer1 {

public static void main(String[] args)throws Exception {

//1、指定端口号,与客户端需要链接的服务器端的端口号相同。

int serverport=3000;

//2、使用ServerSocket(int port)创建服务器端对象。

ServerSocket server=new ServerSocket(serverport);

System.out.println("服务器已经开启等待客户端链接!!!!");

//3.使用创建服务器端对象调用accept接收链接到服务器的客户端对象。

Socket client=server.accept;

//4.使用链接到服务器的客户端对象调用getInputStream创建收发数据的输入流/输出流对象。

InputStream in=client.getInputStream;

//5.使用创建收发数据的输入流对象,调用read方法完成数据的收。

byte data[]=new byte[100];

int len=in.read(data);

String info=new String(data,0,len);

System.out.println("服务器端接收到来自客户端的消息是=="+info);

//6.关闭流和客户端对象与服务器端对象。

in.close;

client.close;

server.close;

}

}

先启动服务器端程序,再运行客户端程序

c3cf1e279920e2207aecd96b4a08fe48.png

10e5ce03fb2837153bd618b4eacd727f.png

例如2:客户端持续向服务器端发送数据,服务器端持续接收到客户端发来的数据

package com.click369.test2;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

/**

* @author Administrator

*

*/

public class TcpClient1 {

public static void main(String[] args)throws Exception {

//1.得到客户端需要链接的服务器端的IP地址,得到端口号。

InetAddress serverip=InetAddress.getLocalHost;

int serverport=3000;

//2.使用Socket(InetAddress address, int port)创建客户端对象

Socket client=new Socket(serverip,serverport);

//3.通过创建客户端对象Socket对象调用getOutputStream创建收发数据的输入流/输出流对象。

OutputStream out=client.getOutputStream;

boolean flag=true;

BufferedReader read=new BufferedReader(new InputStreamReader(System.in));

while(flag){

System.out.println("请输入需要发送的数据:");

String info=read.readLine;

if(info.equals("886")){

flag=false;

}

//4.使用创建收发数据的输出流对象,调用write方法完成数据的发。

out.write(info.getBytes);

}

//5.关闭流和客户端对象。

out.close;

client.close;

}

}

1c1cd03255687712304c17a925913bc7.png

package com.click369.test2;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

*

* @author Administrator

*

*/

public class TcpServer1 {

public static void main(String[] args)throws Exception {

//1、指定端口号,与客户端需要链接的服务器端的端口号相同。

int serverport=3000;

//2、使用ServerSocket(int port)创建服务器端对象。

ServerSocket server=new ServerSocket(serverport);

System.out.println("服务器已经开启等待客户端链接!!!!");

//3.使用创建服务器端对象调用accept接收链接到服务器的客户端对象。

Socket client=server.accept;

//4.使用链接到服务器的客户端对象调用getInputStream创建收发数据的输入流/输出流对象。

InputStream in=client.getInputStream;

boolean flag=true;

byte data[]=new byte[100];

while(flag){

//5.使用创建收发数据的输入流对象,调用read方法完成数据的收。

int len=in.read(data);

String info=new String(data,0,len);

if(info.equals("886")){

flag=false;

}

System.out.println("服务器端接收到来自客户端的消息是=="+info);

}

//6.关闭流和客户端对象与服务器端对象。

in.close;

client.close;

server.close;

}

}

d825fa61f7987cc701e85d576b743ea6.png

f86b635bbd1691a3c25bffbb55d18a55.png

上面的实例只能完成客户端只负责发送数据,服务器负责接收数据

例如2:客户端持续向服务器端发送数据并且接收来自服务器返回的数据,服务器端持续接收到客户端发来的数据,并且向客户端发送响应数据。

package com.click369.test3;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

/**

* @author Administrator

*

*/

public class TcpClient1 {

public static void main(String[] args)throws Exception {

InetAddress serverip=InetAddress.getLocalHost;

int serverport=3000;

Socket client=new Socket(serverip,serverport);

OutputStream out=client.getOutputStream;

InputStream in=client.getInputStream;

boolean flag=true;

BufferedReader read=new BufferedReader(new InputStreamReader(System.in));

byte data[]=new byte[100];

while(flag){

System.out.println("请输入需要发送的数据:");

String info=read.readLine;

if(info.equals("886")){

flag=false;

}

//4.使用创建收发数据的输出流对象,调用write方法完成数据的发。

out.write(info.getBytes);

//客户端读取服务器返回的数据

int len=in.read(data);

String msg=new String(data,0,len);

System.out.println("客户端端接收到来自服务器端的消息是=="+msg);

}

//5.关闭流和客户端对象。

in.close;

out.close;

client.close;

}

}

package com.click369.test3;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

*

* @author Administrator

*

*/

public class TcpServer1 {

public static void main(String[] args)throws Exception {

int serverport=3000;

ServerSocket server=new ServerSocket(serverport);

System.out.println("服务器已经开启等待客户端链接!!!!");

Socket client=server.accept;

InputStream in=client.getInputStream;

OutputStream out=client.getOutputStream;

boolean flag=true;

byte data[]=new byte[100];

while(flag){

int len=in.read(data);

String info=new String(data,0,len);

if(info.equals("886")){

flag=false;

}

System.out.println("服务器端接收到来自客户端的消息是=="+info);

//服务器端向客户端发送响应数据

info="server-"+info;

out.write(info.getBytes);

}

out.close;

in.close;

client.close;

server.close;

}

}

fafae77863cd573f3f575a7b39eccd55.png

872e7dd7329a573d9b2fb3eab6f5b5b5.png

上面实例只能完后一个服务器服务与一个客户端。

19ab619e6c11ba405a30682daf1191aa.png

例如2:一台服务器端持续接收到多个客户端发来的数据,并且向多个客户端发送响应数据。客户端持续向服务器端发送数据并且接收来自服务器返回的数据。

【一台服务器服务于多个客户端】此时需要使用多线程技术

package com.click369.test4;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

/**

* @author Administrator

*

*/

public class TcpClient1 {

public static void main(String[] args)throws Exception {

InetAddress serverip=InetAddress.getLocalHost;

int serverport=3000;

Socket client=new Socket(serverip,serverport);

OutputStream out=client.getOutputStream;

InputStream in=client.getInputStream;

boolean flag=true;

BufferedReader read=new BufferedReader(new InputStreamReader(System.in));

byte data[]=new byte[100];

while(flag){

System.out.println("请输入需要发送的数据:");

String info=read.readLine;

if(info.equals("886")){

flag=false;

}

//4.使用创建收发数据的输出流对象,调用write方法完成数据的发。

out.write(info.getBytes);

//客户端读取服务器返回的数据

int len=in.read(data);

String msg=new String(data,0,len);

System.out.println("客户端端接收到来自服务器端的消息是=="+msg);

}

//5.关闭流和客户端对象。

in.close;

out.close;

client.close;

}

}

package com.click369.test4;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

/**

* 服务器为每一个客户端提供的线程操作类

* @author Administrator

*

*/

public class ServerThread extends Thread{

private Socket client;

public ServerThread(Socket client){

this.client=client;

}

@Override

public void run {

try{

InputStream in=client.getInputStream;

OutputStream out=client.getOutputStream;

boolean flag=true;

byte data[]=new byte[100];

while(flag){

int len=in.read(data);

String info=new String(data,0,len);

if(info.equals("886")){

flag=false;

}

System.out.println("服务器端接收到来自客户端的消息是=="+info);

//服务器端向客户端发送响应数据

info="server-"+info;

out.write(info.getBytes);

}

out.close;

in.close;

client.close;

}catch(Exception e){

e.printStackTrace;

}

}

}

package com.click369.test4;

import java.net.ServerSocket;

import java.net.Socket;

/**

* @author Administrator

*/

public class TcpServer1 {

public static void main(String[] args)throws Exception {

int serverport=3000;

ServerSocket server=new ServerSocket(serverport);

System.out.println("服务器已经开启等待客户端链接!!!!");

boolean flag=true;

while(flag){

Socket client=server.accept;

//为链接到服务器的每一个客户端单独开启一天线程

ServerThread serverThread=new ServerThread(client);

serverThread.start;

}

server.close;

}

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值