原标题:Java基于TCP的通讯程序
为了更好的帮助大家便利的学习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 关闭此套接字。
客户端的创建步骤:
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;
}
}
先启动服务器端程序,再运行客户端程序
例如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;
}
}
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;
}
}
上面的实例只能完成客户端只负责发送数据,服务器负责接收数据
例如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;
}
}
上面实例只能完后一个服务器服务与一个客户端。
例如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;
}
责任编辑: