TCP客户端服务器Demo
Client:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client extends Thread {
//定义一个Socket对象
Socket socket = null;
public Client(String host, int port) {
try {
//需要服务器的IP地址和端口号,才能获得正确的Socket对象
socket = new Socket(host, port);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//客户端一连接就可以写数据个服务器了
new sendMessThread().start();
super.run();
try {
// 读Sock里面的数据
InputStream s = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = s.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
//往Socket里面写数据,需要新开一个线程
class sendMessThread extends Thread{
@Override
public void run() {
super.run();
//写操作
Scanner scanner=null;
OutputStream os= null;
try {
scanner=new Scanner(System.in);
os= socket.getOutputStream();
String in="";
do {
in=scanner.next();
os.write(("客户端:"+in).getBytes());
os.flush();
} while (!in.equals("bye"));
} catch (IOException e) {
e.printStackTrace();
}
scanner.close();
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//需要服务器的正确的IP地址和端口号
Client client=new Client("127.0.0.1", 6666);
client.start();
}
}
Sever:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/** * 可以实现和客户端的相互发送消息的交互 可以是多台电脑 * * */
public class Server2 extends Thread {
// 用来存放连接上的用户的socket对象的值
List<Socket> list = new ArrayList<>();
// 定义服务器接口ServerSocket
ServerSocket server = null;
// 定义一个服务器,定义端口
public Server2(int port) {
try {
server = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
// 发送消息的线程
@Override
public void run() {
super.run();
try {
while (true) {
// 建立socket接口,accept方法是一个阻塞进程,等到有用户连接才往下走
// 定义Socket类
Socket socket = server.accept();
// 在服务器显示连接的上的电脑、
String message = socket.getInetAddress().getHostAddress().toString();
System.out.println(message+"连接上了");
// 向用户发送消息
SendMessageToAllUser(message);
// 把连接上的用户添加到集合;里面去
list.add(socket);
//开始新连接用户的线程,用于该可以一直读取数据
new readerThread(socket).start();;
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 把消息发送给每一个用户,涉及到写的操作OutStream
private void SendMessageToAllUser(String message) {
// 拿到每一个用户的socket对象,对其进行写入数据
for (Socket socket : list) {
// 判读之前保存的连接是否还在
if (socket != null && socket.isConnected()) {
try {
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());
os.flush();// 刷新一下写入的数据,很有必要
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 读取客户端的信息
class readerThread extends Thread {
InputStream is = null;
// 这里传入一个socket对象,因为每一个用户都要用一个不同的线程存放的socket对象来进行一直读取数据
public readerThread(Socket socket) {
try {
System.out.println("服务器在启动中...等待用户的连接");
// 获取输入流
is = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
super.run();
try {
int len = 0;
byte[] buf = new byte[1024];
while ((len = is.read(buf)) != -1) {
// 把读取到的数据发送给其他用户
SendMessageToAllUser(new String(buf, 0, len));
System.out.println("服务器接收到客户端的数据:"+new String(buf,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//这里服务器只需要定义一个端口号就可以了,IP地址程序会自动获取
//但是客户端需要连接这个服务器时,需要知道它的IP地址还有端口号
//ip地址的查看方法:进入cmd窗口,输入ipconfig/all可以看到
Server2 server=new Server2(6666);
server.start();
}
}
还没有评论,来说两句吧...