创建一个Server端和Client端
在客户端指定主机地址和端口。
在创建IO流的时候使用的是装饰器模式!
用户输入使用的是
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
客户端代码:
import java.io.*;
import java.net.Socket;
public class Client
{
public static void main(String[] args)
{
final String DEFAULT_SERVER_HOST = "127.0.0.1";
final int DEFAULT_SERVER_PORT = 8888;
BufferedWriter writer = null;
Socket socket = null;
try
{
// 创建socket
socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
// 创建IO流
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 等待用户输入信息
// 用户输入有几种方法?
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
// 用户回车就可以获得到信息了
String input = consoleReader.readLine();
// 发送消息给服务器
writer.write(input + "\n");
writer.flush();
// 读取服务器返回的消息
String msg = reader.readLine();
System.out.println(msg);
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (writer != null)
{
try
{
writer.close();
System.out.println("关闭客户端socket");
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
在服务器端指定监听的端口
服务器端代码:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
public static void main(String[] args)
{
final int DEFAULT_PORT = 8888;
ServerSocket serverSocket = null;
// 绑定监听端口
try
{
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("启动服务器,监听端口" + DEFAULT_PORT);
while (true)
{
// 等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端" + socket.getPort() + "已经连接");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 读取客户端发送的消息
String msg = reader.readLine();
if (msg != null)
{
System.out.println("客户端" + socket.getPort() + "\t" + msg);
// 回复客户端
writer.write("服务器:" + msg + "\n");
// 将缓冲区数据全部发送出去
writer.flush();
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (serverSocket != null)
{
try
{
serverSocket.close();
System.out.println("关闭服务器端的socket");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
}
writer.flush();//表示清空缓冲区
运行:
首先启动服务器端
启动服务器,监听端口8888
然后在启动客户端,在控制台输入hello
客户端控制台:
hello
服务器:hello
关闭客户端socket
服务器端控制台
启动服务器,监听端口8888
客户端52317已经连接
客户端52317 hello
改进的可持续读写输出的Server和Client
NewServer:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class NewServer
{
public static void main(String[] args)
{
final String QUIT = "quit";
final int DEFAULT_PORT = 8888;
ServerSocket serverSocket = null;
// 绑定监听端口
try
{
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("启动服务器,监听端口" + DEFAULT_PORT);
while (true)
{
// 等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端" + socket.getPort() + "已经连接");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String msg = null;
while ((msg = reader.readLine()) != null)
{
System.out.println("客户端" + socket.getPort() + "\t" + msg);
// 回复客户端
writer.write("服务器:" + msg + "\n");
writer.flush();
// 查看客户端是否退出
if (QUIT.equals(msg))
{
System.out.println("客户端" + socket.getPort() + "断开连接");
break;
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (serverSocket != null)
{
try
{
serverSocket.close();
System.out.println("关闭服务器端的socket");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
}
NewClient:
import java.io.*;
import java.net.Socket;
public class NewClient
{
public static void main(String[] args)
{
final String QUIT = "quit";
final String DEFAULT_SERVER_HOST = "127.0.0.1";
final int DEFAULT_SERVER_PORT = 8888;
BufferedWriter writer = null;
Socket socket = null;
try
{
// 创建socket
socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
// 创建IO流
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 等待用户输入信息
// 用户输入有几种方法?
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
// 用户回车就可以获得到信息了
while (true)
{
String input = consoleReader.readLine();
// 发送消息给服务器
writer.write(input + "\n");
writer.flush();
// 读取服务器返回的消息
String msg = reader.readLine();
System.out.println(msg);
// 查看用户是否退出
if(QUIT.equals(input)){
break;
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (writer != null)
{
try
{
writer.close();
System.out.println("关闭客户端socket");
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
运行结果:
Server控制台:
启动服务器,监听端口8888
客户端52618已经连接
客户端52618 马钊
客户端52618 123
客户端52618 quit
客户端52618断开连接
Client控制台:
马钊
服务器:马钊
123
服务器:123
quit
服务器:quit
关闭客户端socket