1.TCP连接是网络连接中的以一种,是很多其他协议的承载协议(本质),CP协议的连接在java、中使用的是套接字来实现的套接字类分为两种,一种是为了满足服务器使用的套接字,另一种是客户端使用的套接字,java中的Socket就是一个套接
先面我先实现一个服务端,可以连接好多个客户端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class TCPTest {
//客户端组,连接的所有客户端放在这个List中
public static List<Socket> clients = new ArrayList<>();
public static void main(String[] args) {
/*
* Socket这个类,我们直接创建对象时用的,是客户端连接服务器用的代码如下:
* Socket socket = new Socket(host,port);
*/
try {
@SuppressWarnings("resource")
//定义服务端的端口号
ServerSocket server = new ServerSocket(500);
//创建套接字
Socket s ;//阻塞方式
//阻塞式的,没有client端连接就一直监听着,等待连接.直到有client端连接进来才通过
//socket实例与client端进行交互,一个server端可以被多个client端连接,每连接一次都会创
//建一个socket实例,派发服务线程.
while(( s = server.accept()) != null){
clients.add(s);
//通信的类,用线程来实现
GetDtaThread data = new GetDtaThread(s);
data.start();
}
System.out.println("你走了啊 拜拜");
} catch (IOException e) {
e.printStackTrace();
}
}
}
交互的类 GetDtaThread
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class GetDtaThread extends Thread{
Socket s ;
//就是强行把缓冲区的数据输出
PrintWriter pw ;
public GetDtaThread(Socket s) {
this.s = s ;
}
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
String str1;
while((str1=scanner.next())!=null) {
//输出的线程方法
WriteDataThread.broadCastToAll(str1);
}
try {
//获取客户端发来的消息,InputStreamReader将字节装华为字符 缓存到BufferedReader缓冲区
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str ;
while((str = br.readLine()) != null) {
//客户端的Ip+发过来的内容
System.out.println(s.getInetAddress() + " : " + str);
//写过去,发送给客户端
WriteDataThread.broadCastToAll(str);
//输入bye结束交谈
if(str.equals("bye")) {
br.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
交互的类 WriteDataThread
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class WriteDataThread extends Thread {
Socket s;
public WriteDataThread(Socket s) {
this.s = s;
}
@Override
public void run() {
}
public static void broadCastToAll(String str) {
try {
for (Socket socket : TCPTest.clients) {
//行把缓冲区的数据输出 返回一个服务器与客户端的输出流
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println(str);
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在实现一个客户端
package com.lanou.classwork;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class User {
public static void main(String[] args) {
//创建用户
try {
Socket socket = new Socket("127.0.0.1", 500);
//向服务端发消息的类
SendChat send = new SendChat(socket);
send.start();
//接受服务端发来的消息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str ;
while((str = br.readLine())!=null) {
System.out.println(str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
交互类 SendChat
import com.lanou.homework.Tmocat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
//发消息给服务端
public class SendChat extends Thread{
PrintWriter pw ;
Socket socket;
public SendChat(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
String str ;
while((str=scanner.next())!=null){
try {
pw = new PrintWriter(socket.getOutputStream());
System.out.println( str);
pw.println(str);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
if(str.equals("bye")){
pw.close();
}
}
}
}