Java Socket通信服务器端对两台客户端[简单实例]
- 如何修改代码在你电脑完成运行
- 代码
- 注意事项
- 计算机常用的端口
可以实现的功能:一台电脑运行服务端代码,两台电脑运行客户端代码,可以实现经过服务端中转,客户端a向客户端b发送多条消息,客户端b向客户端a发送多条消息,不需要限制与你一句,我一句,你才能继续下一句,而是可以客户端b只收客户端a发出的多条信息,可以不回信息,客户端a同理。
准备材料:
1-3台电脑
java环境
电脑需要在同一个局域网[ 连的是同一个wifi,以太网,或者手机热点 ]
如何修改代码在你电脑完成运行
1.如果你有条件,即有eclipse、MyEclipse、IDEA工具等,请先创建新的项目,名字自己随便取,这里我取socketDemo。
2.如果是三台电脑,那么服务端建立Services .java,客户端a建立StartChat.java,客户端b建立StartChat2.java。
3.查看服务端所连接的内网ip
打开cmd,输入ipconfig
如果服务端连接的是wifi,那么找到【无线局域网适配器 WLAN:】里面的ipv4,如果你是插入网线连接的,那么找到【以太网适配器 以太网:】里面的ipv4,
4.查看客户端a和b所在局域网ip地址。
步骤同3,找到a和b的ip地址
5.设置分别开放端口
这里我选取服务端开放端口为 3000,a开放端口4545,b开放端口34343。[这里的不是固定的,可以自己取]
6.修改服务端代码
1.修改a和b的ip地址
String ip1 ="127.0.0.1"; //客户端a的所在的 局域网的内网地址
String ip2 = "10.4.131.187"; //客户端b的所在的 局域网的内网地址
1.修改a和b的接收消息开放端口[自定义]
Socket sk = new Socket(ip,4545); //客户端 a开放的消息接收端口
Socket sk = new Socket(ip,34343);//客户端 b开放的消息接收端口
7.修改客户端a的代码
1.修改a中服务端ip地址
String serveip = "10.4.132.161";//这里改成服务端的所在内网的ip地址
2.修改a中服务端服务端口
String serveip = "10.4.132.161";//这里改成服务端的所在内网的ip地址
sk = new Socket(ip,3000); //3000是服务端开放的 服务端口
8.修改客户端b的代码
1.修改a中服务端ip地址
String serveip = "10.4.132.161";//这里改成服务端的所在内网的ip地址
2.修改a中服务端服务端口
String serveip = "10.4.132.161";//这里改成服务端的所在内网的ip地址
sk = new Socket(ip,3000); //3000是服务端开放的 服务端口
按步骤运行程序。
1.运行 服务端代码,开始监听。
2.运行 客户端a,开始上线,与服务端建立连接。
3.运行 客户端b,开始上线,与服务端建立连接。
4.在a或者b的程序控制台中输入聊天内容,输入 退出 退出连接。
代码
客户端a
package socketDemo; //你需要建立一个java项目
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
public class StartChat {
public static void main(String[] args) throws UnknownHostException, IOException {
//建立客户
Scanner input = new Scanner(System.in);
String news;
String serveip = "172.20.10.4";//这里改成服务端的所在内网的ip地址
InetAddress ip = InetAddress.getByName(serveip);
Getnewsw g = new Getnewsw();
g.start();
news = input .next();
Socket sk ;
OutputStream os ;
while(!news.equals("退出")) {
sk = new Socket(ip,3000); //3000是服务端开放的 服务端口
os = sk.getOutputStream();
os.write(news.getBytes());
news = input .next();
sk.close();
}
System.out.println("已退出");
}
}
class Getnewsw extends Thread{
public void run() {
int count = 0;
Socket client;
try {
int servePort = 4545;//客户端开放的端口,这里最好不改。服务端会通过这个端口来发送消息给你
ServerSocket ss = new ServerSocket(servePort);
while(true) {
count++;
if(count==1) {
System.out.println("\n您已上线\n");
}
client =ss.accept();
InputStream is = client.getInputStream();
byte []data = new byte[10240];//如果你想发送更长的聊天消息,可以适当增大字节数组
int length;//得到的字节个数
length = is.read(data);
InetAddress hostname = client.getInetAddress();
int hostport = client.getLocalPort();
String username = client.getInetAddress().getHostName();
System.out.print("来自"+hostname+":["+hostport+"]"+"\n");
String reply = new String(data,0,length);
System.out.println(reply);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端b
package socketDemo;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
public class StartChat2 {
public static void main(String[] args) throws UnknownHostException, IOException {
//建立客户
//本机ip地址
String localIp = "/127.0.0.1";//这里不用改
Scanner input = new Scanner(System.in);
String news;
String serveip = "127.0.0.1"; //改成 服务端ip地址
Getnewsww g = new Getnewsww();
g.start();
news = input .next();
InetAddress ip = InetAddress.getByName(serveip);
Socket sk ;
OutputStream os ;
while(!news.equals("退出")) {
sk = new Socket(ip,3000); // 3000 服务端 开放的端口。
os = sk.getOutputStream();
os.write(news.getBytes());
sk.close();
news = input .next();
}
System.out.println("已退出");
}
}
class Getnewsww extends Thread{
public void run() {
int count = 0;
Socket client;
try {
int servePort = 34343; //客户端b开放的端口
ServerSocket ss = new ServerSocket(servePort);
while(true) {
count++;
if(count==1) {
System.out.println("\n您已上线\n");
}
client =ss.accept();
InputStream is = client.getInputStream();
byte []data = new byte[10240];
int length;//得到的字节个数
length = is.read(data);
InetAddress hostname = client.getInetAddress();
int hostport = client.getLocalPort();
String username = client.getInetAddress().getHostName();
System.out.print("来自"+hostname+":["+hostport+"]"+"\n");
String reply = new String(data,0,length);
System.out.println(reply);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端
package socketDemo; //这里你需要自己用 java编辑工具 比如eclipse 新建一个java项目 名字叫 socketHomework,或者其他都行,只需要改成对应项目名
import java.net.Socket;
import java.util.Scanner;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
public class Services {
//服务器端,负责监听端口
public static void main(String[] args) throws IOException {
int servePort = 3000; //服务端的 服务端口
ServerSocket ss ;
Socket client;
int serves = 0;
SendClient1 sc;
SendClient2 sc2;
// 客户1 和客户2的ip地址
String ip1 ="127.0.0.1"; //客户端a的所在的 局域网的内网地址
String ip2 = "10.4.131.187"; //客户端b的所在的 局域网的内网地址
InetAddress IP1 =InetAddress.getByName(ip1);
InetAddress IP2 =InetAddress.getByName(ip2);
while(true) {
//判断 是否退出
serves++;
if(serves==1) {
System.out.print("欢迎,开始等待客户端....");
}
ss = new ServerSocket(servePort);
client =ss.accept();
System.out.print("\n第"+serves+"次服务");
InputStream is = client.getInputStream();
byte []data = new byte[10240];
int length;//得到的字节个数
length = is.read(data);
InetAddress hostname = client.getInetAddress();
int hostport = client.getLocalPort();
System.out.print("来自"+hostname+":["+hostport+"]\n");
System.out.println("e:"+hostname+"?");
String reply = new String(data,0,length);
OutputStream os = client.getOutputStream();
if(!hostname.equals(IP2)) {
sc2 = new SendClient2();
sc2.news = reply;
sc2.start();
}
else {
sc = new SendClient1();
sc.news = reply;
sc.start();
}
ss.close();
is.close();
}
}
}
class SendClient1 extends Thread{ //接收客户端b的消息,然后把这个消息发送给客户端a
static String news;
public void run() {
Socket client;
try {
//建立客户 我自己
String serveip = "127.0.0.1"; //客户端a的所在的 局域网的内网地址
InetAddress ip = InetAddress.getByName(serveip);
Socket sk = new Socket(ip,4545); //客户端 a开放的消息接收端口
OutputStream os = sk.getOutputStream();
os.write(news.getBytes());
//接收客户端的数据
InputStream is = sk.getInputStream();
byte []replynew = new byte[1024];
int length;
length = is.read(replynew);
System.out.println(new String(replynew,0,length));
sk.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class SendClient2 extends Thread{
static String news;
public void run() {
String serveip = "10.4.131.187"; //客户端b的所在的 局域网的内网地址
try {
InetAddress ip = InetAddress.getByName(serveip);
Socket client;
Socket sk = new Socket(ip,34343);//客户端 b开放的消息接收端口
OutputStream os = sk.getOutputStream();
os.write(news.getBytes());
//接收客户端的数据
InputStream is = sk.getInputStream();
byte []replynew = new byte[1024];
int length;
length = is.read(replynew);
System.out.println(new String(replynew,0,length));
sk.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意事项
1.两个客户端开放的端口最好不要一样。
2.服务端的服务端口以及客户端的消息接收端口最好不要跟常用的端口一样。常用的端口见下面。
3.运行代码时,先运行服务端代码,然后开客户端a代码,然后开客户端b代码,两个客户端均显示已上线后即可相互发送信息
4.可以不用关防火墙
5.如果客户端a发送的消息在服务端中有响应,但是没有发送给客户端b,那么需要耐心等待,因为socket通信的tcp协议需要三次握手,服务端然后才能发送消息给端b。