客户端代码:
package com.lcx.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
*
* @author
*/
public class SocketClient {
public static void main(String[] args) {
try {
/**
* 回想下流的读入写出概念:
* 如果是磁盘IO,那么何为读入?将磁盘内容读入到内存中。何为写出?将内存的内容写出到磁盘中持久化。
* 如果是网络IO,那么何为读入?将网络传输的内容读入到内存中。何为写出?将内存的内容写出到网络传输中。
* 以InputStream/Reader结尾的一般是 读入字节/字符流。
* 以OutputStream/Writer结尾的一般是 写出字节/字符流。
* 主要步骤:
* 1、客户端根据服务器端IP地址和端口号获取socket对象。
* 2、根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
* 3、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
* 4、关流、关socket
* 用单线程实现客户端和服务端简单的消费推送
* 随后实现客户端和服务端进行通话
*/
//1、获取socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 6666);
//2、获取读入流
BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**
* 网上字符流的写出大都用的PrintWriter,我想字符流读入用的 BufferedReader那么字符流的写出也可以用BufferedWriter
* 实际上是可以,PrintWriter.println可以直接结束本行开始下一个文本行,而BufferedWriter必须BufferedWriter.newLine
* 手动结束本行开始下一行。write方法调用后,再其后必须调用newLine实现该文本行的结束,否则BufferedReader读取不到
*
*/
//3、获取写出流,BufferedWriter实现
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write("客户端:我是客户端");
bufferedWriter.newLine();
bufferedWriter.write("客户端:我是客户端的王五");
bufferedWriter.newLine();
bufferedWriter.write("客户端:服务端的张三在吗?");
bufferedWriter.newLine();
bufferedWriter.flush();
//3、获取写出流,PrintWriter实现
PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//PrintWriter.print 打印,PrintWriter.println 打印后终止该行,此行为一个文本行
sendToServerInfo.println("客户端:我是客户端");
sendToServerInfo.println("客户端:我是客户端的王五");
sendToServerInfo.println("客户端:服务端的张三在吗?");
sendToServerInfo.flush();
//读取客户端反馈的信息
while(acceptServerInfo.ready()){
String line = acceptServerInfo.readLine();
System.out.println(line);
}
sendToServerInfo.close();
bufferedWriter.close();
acceptServerInfo.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端代码:
package com.lcx.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) {
/**
* 服务端
* 1、根据端口号(并不需要IP,本机就是服务端)创建ServerSocket对象
* 2、根据ServerSocket对象accept方法创建Socket对象
* 3、同客服端一样,根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
* 4、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
* 5、关流、关socket
*/
try {
//1、创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(6666);
//2、根据ServerSocket对象创建Socket对象,等待客户端连接
Socket socket = serverSocket.accept();
//3、接受客户端信息
BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//4、给客户端信息
PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//读取客户端发来的信息
while(acceptClientInfo.ready()){
//读取一个文本行
String info = acceptClientInfo.readLine();
System.out.println(info);
}
//给客户端发信息
sendToClientInfo.println("服务端:我是服务端的张三");
sendToClientInfo.println("服务端:你是客户端的李四吗?");
sendToClientInfo.flush();
sendToClientInfo.close();
acceptClientInfo.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端和客户端进行消息的相互推送
客服端代码
package com.lcx.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
*
* @author
*/
public class SocketClient2 {
public static void main(String[] args) {
try {
/**
* 回想下流的读入写出概念:
* 如果是磁盘IO,那么何为读入?将磁盘内容读入到内存中。何为写出?将内存的内容写出到磁盘中持久化。
* 如果是网络IO,那么何为读入?将网络传输的内容读入到内存中。何为写出?将内存的内容写出到网络传输中。
* 以InputStream/Reader结尾的一般是 读入字节/字符流。
* 以OutputStream/Writer结尾的一般是 写出字节/字符流。
* 主要步骤:
* 1、客户端根据服务器端IP地址和端口号获取socket对象。
* 2、根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
* 3、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
* 4、关流、关socket
* 用单线程实现客户端和服务端简单的消费推送
* 随后实现客户端和服务端进行通话
*/
System.out.println("-------------客户端界面------------------");
//1、获取socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 6666);
//2、获取读入流
BufferedReader acceptServerInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3、获取写出流
PrintWriter sendToServerInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//从控制台,输入消息和服务端对话,输入流
// BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));
Scanner inputInfo = new Scanner(System.in);
while(true){
//发送消息
// String str = inputInfo.readLine();
String str = inputInfo.nextLine();
if("end".equals(str)){
break;
}
System.out.println("客户端:"+str);
sendToServerInfo.println("客户端:"+str);
sendToServerInfo.flush();
//接受消息
String acStr = acceptServerInfo.readLine();
System.out.println(acStr);
}
sendToServerInfo.close();
acceptServerInfo.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端代码
package com.lcx.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SocketServer2 {
public static void main(String[] args) {
/**
* 服务端
* 1、根据端口号(并不需要IP,本机就是服务端)创建ServerSocket对象
* 2、根据ServerSocket对象accept方法创建Socket对象
* 3、同客服端一样,根据socket对象获取读入流,获取服务端反馈的内容。将字节流转换成字符流,然后处理信息。
* 4、根据socket对象获取写出流,用于想服务端发送内容。同样将字节流转换成字符流,然后处理信息。
* 5、关流、关socket
*/
try {
System.out.println("-------------服务端界面------------------");
//1、创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(6666);
//2、根据ServerSocket对象创建Socket对象,等待客户端连接
Socket socket = serverSocket.accept();
//3、获取读入流
BufferedReader acceptClientInfo = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//4、获取写出流
PrintWriter sendToClientInfo = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
// BufferedReader inputInfo = new BufferedReader(new InputStreamReader(System.in));
Scanner inputInfo = new Scanner(System.in);
while(true){
//读取客户端信息
String info = acceptClientInfo.readLine();
System.out.println(info);
// String str = inputInfo.readLine();
String str = inputInfo.nextLine();
if("end".equals(str)){
break;
}
//给客户端发信息
System.out.println("服务端:"+str);
sendToClientInfo.println("服务端:"+str);
sendToClientInfo.flush();
}
sendToClientInfo.close();
acceptClientInfo.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
对话截图: