@[TOC]简单Socket编程
1.一对一通信
//***************服务器代码(Server.java)
public class Server {
public static void main(String[] args) {
try {
//在创建socket的时候指定连接相应IP跟端口的服务器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动");
//阻塞性方法,直到有客户端连接进来这个方法才会启动
//accept方法能接受一个客户端的示例并保存到socket变量中
Socket socket = serverSocket.accept();
System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
//服务器接收信息,只能接受一行
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content = bufferedReader.readLine();//读取一行信息
System.out.println(content);
//服务器收到消息后在回应客户端,将对象的格式表示打印到文本输出流。
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
printWriter.println("服务器 say hello");
printWriter.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// ************客户端(Client.java)
public class Client {
public static void main(String[] args) {
try {
//定义一个指定端口的服务器,等待客户端的连接
Socket socket = new Socket("localhost",8888);
//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
printWriter.println("客户端 say hello");
printWriter.flush();
//客户端接收服务器的回应
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content=bufferedReader.readLine();//readLine()是一个阻塞性方法
System.out.println(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.一对一循环通信
//*************服务器
public class Server1 {
public static void main(String[] args) {
try {
//在创建socket的时候指定连接相应IP跟端口的服务器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动");
//阻塞性方法,直到有客户端连接进来这个方法才会启动
//accept方法能接受一个客户端的示例并保存到socket变量中
Socket socket = serverSocket.accept();
System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
while(true){
//服务器接收信息,只能接受一行
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content = bufferedReader.readLine();//读取一行信息
System.out.println(content);
//服务器收到消息后在回应客户端
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner input = new Scanner(System.in);
String str = input.nextLine();
printWriter.println(str);
printWriter.flush();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//***************客户端
public class Client1 {
public static void main(String[] args) {
try {
//定义一个指定端口的服务器,等待客户端的连接
Socket socket = new Socket("localhost",8888);
while(true){
//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String str = new Scanner(System.in).nextLine();
printWriter.println(str);
printWriter.flush();
//客户端接受服务器的回应
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content=bufferedReader.readLine();
System.out.println(content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.一(服务器)对多(客户端)通信
//*************服务器
public class TServer {
public static void main(String[] args) {
try {
//在创建socket的时候指定连接相应IP跟端口的服务器
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动");
while (true) {
//阻塞性方法,直到有客户端连接进来这个方法才会启动
//accept方法能接受一个客户端的示例并保存到socket变量中
Socket socket = serverSocket.accept();
System.out.println("ip:"+socket.getLocalAddress()+",端口号:"+socket.getPort());
Thread thread = new Thread(new ServerThread(socket));
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//**************客户端
public class TClient {
public static void main(String[] args) {
try {
//定义一个指定端口的服务器,等待客户端的连接
Socket socket = new Socket("localhost",8888);
while(true){
//通过PrintWriter中的println方法可以输出信息,PrintWriter只能输出字符流的信息
//但是现在TCP的socket通信时基于字节流通讯的,所以要做字节流到字符流的转变,通过OutputStreamWriter
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String str = new Scanner(System.in).nextLine();
printWriter.println(str);
printWriter.flush();
//客户端接受服务器的回应
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content=bufferedReader.readLine();
System.out.println(content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//***************线程
public class ServerThread implements Runnable{
Socket socket;
ServerThread(){
}
ServerThread(Socket socket){
this.socket=socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
//服务器接收信息,只能接受一行
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content = bufferedReader.readLine();//读取一行信息
System.out.println(content);
//服务器收到消息后在回应客户端
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner input = new Scanner(System.in);
String str = input.nextLine();
printWriter.println(str);
printWriter.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
一个输入输出流的介绍:https://blog.youkuaiyun.com/hanxue_wuhen/article/details/71985319