基于TCP协议的通信是客户端和服务器建立连接通道,这个管道就像一个输出输入流,发送信息使用输出流,接收信息使用输入流。
//单客户于服务器
//单客户端的连接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
//单客户端,在应用中后运行
public class EchoClient {
public static void main(String[] args) {
String hostName = "";//服务器的IP地址,这里表示本机,相当于127.0.0.1
int portNumber = 8;
try {
//客户端通过创建Socket,通过服务器的IP地址和端口号,连接服务器
Socket echoSocket =new Socket(hostName,portNumber);
PrintWriter out =new PrintWriter(echoSocket.getOutputStream(),true);
BufferedReader in =new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =new BufferedReader(new InputStreamReader(System.in));
String userInput;
while((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo:"+ in.readLine());
}
}catch(UnknownHostException e) {
e.printStackTrace();
System.exit(1);
}catch(IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}
//服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while((inputLine = in.readLine()) != null) {
System.out.println("来自客户端:"+inputLine);
out.println(inputLine);
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
//多客户与服务器
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class EchoMultiClient {
public EchoMultiClient() {
String hostName = "";
int portNumber = 7;
try {
Socket echoSocket = new Socket(hostName,portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(),true);
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("客户端:"+echoSocket.getLocalAddress().getHostName()+":"+echoSocket.getLocalPort());
//发送信息的线程,用输出流out实现发数据到服务器
new Thread(new Runnable() {//实现一个匿名Runnable类,创建匿名对象,并用匿名对象创建Thread线程对象
public void run() {
String userInput;
try {
while((userInput = stdIn.readLine()) !=null) {
out.println(userInput);
}
}catch(IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}).start();
new Thread(new Runnable() {
public void run() {
String receiveStr;
try {
while((receiveStr = in.readLine()) !=null) {
System.out.println("echo:"+receiveStr);
}
}catch(IOException e) {
e.printStackTrace();
System.exit(1);
}
}
}).start();
}catch(UnknownHostException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new EchoMultiClient();
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class EchoMultiServer {
ServerSocket serverSocket;
List<Socket> clients = new ArrayList<Socket>();
public EchoMultiServer() {
try {
serverSocket = new ServerSocket(7);
while (true) {
Socket clientSocket = serverSocket.accept();
clients.add(clientSocket);
new EchoServerThread(clientSocket,clients).start();
}
}catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new EchoMultiServer();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.List;
public class EchoServerThread extends Thread{
Socket myClient;
List<Socket> clients;
String clientHostname;
int clientPort;
public EchoServerThread(Socket myClient,List<Socket> clients) {
super();
this.myClient = myClient;
this.clients = clients;
}
public void run() {
InetSocketAddress clientAddress =(InetSocketAddress)
myClient.getRemoteSocketAddress();
clientHostname = clientAddress.getHostName();
clientPort = clientAddress.getPort();
System.out.println("第"+clients.size()+"个客户端:"+clientHostname+":"+clientPort+"已连接");
try {
String inStr;
BufferedReader in = new BufferedReader(new InputStreamReader(myClient.getInputStream()));
while((inStr = in.readLine()) !=null) {
System.out.println(inStr+"。来自"+clientHostname+":"+clientPort+"");
for(Socket client :clients) {
if(client != null) {
PrintWriter out = new PrintWriter(client.getOutputStream(),true);
out.println(inStr+"。来自"+clientHostname+":"+clientPort+"");
}
}
}
}catch(IOException e) {
System.err.println(clientHostname+":"+clientPort+"退出了");
}
}
}
注意:运行时先运行服务器端在运行客户端