java网络编程:1,基本的网络编程模型
java网络编程的通信模型 - 客户/服务器模型
编写一个socket,使得客户端和服务器启动后可以持续通信(*交谈)直到客户端输入“bye”结束
客户机源码:
package network_chap01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
public class EchoClient2 {
public static void main(String[] args) {
Socket clientSocket = null;
BufferedReader in = null;
BufferedWriter out = null;
try {
//1.创建客户机套接字
clientSocket = new Socket();
SocketAddress remoteAddr=new InetSocketAddress("localhost",5000);
System.out.println("1.创建客户机套接字成功!");
//2.连接服务器
clientSocket.connect(remoteAddr);
System.out.println("2.客户机连接服务器localhost端口5000成功!");
System.out.println("客户机使用的地址和端口:"+clientSocket.getLocalSocketAddress());
//与服务器会话
in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
out = new BufferedWriter(
new OutputStreamWriter(
clientSocket.getOutputStream()));
String recvStr;
while(true)
{
System.out.print("请输入发送的信息: ");
BufferedReader localReader=new BufferedReader
(new InputStreamReader(System.in));
String sendStr=localReader.readLine();
System.out.println("3.1向服务器发送字符串成功!"+sendStr);
out.write(sendStr); //向服务器发送字符串
out.newLine();
out.flush();
recvStr=in.readLine(); //从服务器接收字符串
System.out.println("3.2从服务器接收回送字符串成功!"+recvStr);
}
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
//关闭套接字和流
try {
if (in != null) in.close();
if (out != null) out.close();
if (clientSocket != null) clientSocket.close();
System.out.println("4.关闭套接字和流成功!");
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
}
}
服务器源码:
package network_chap01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class EchoServer2 {
public static void main(String[] args) {
//1.启动服务器
ServerSocket listenSocket = null;
Socket clientSocket = null;
BufferedReader in = null;
BufferedWriter out = null;
try {
listenSocket = new ServerSocket();
SocketAddress serverAddr=new InetSocketAddress("localhost",5000);
listenSocket.bind(serverAddr);
System.out.println("1.服务器启动成功!开始在localhost的5000端口侦听连接...");
//2.处理连接
clientSocket = listenSocket.accept();
System.out.println("2.客户机连接成功!客户机地址和端口:"+clientSocket.getRemoteSocketAddress());
//3.与客户机会话
in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
out = new BufferedWriter(
new OutputStreamWriter(
clientSocket.getOutputStream()));
while(true)
{
String recvStr=in.readLine(); //从客户机接收字符串
System.out.println("3.1 服务器收到字符串:"+recvStr);
if (recvStr.equals("bye"))
{
System.out.println("服务机下线!");
break;
}
else{
out.write(recvStr); //向客户机回送字符串
out.newLine();
out.flush();
}
//System.out.println("3.2 服务器回送字符串成功:"+recvStr);
}
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
//4.关闭套接字和流
try {
if (in != null)in.close();
if (out != null) out.close();
if (listenSocket != null) listenSocket.close();
if (clientSocket != null) clientSocket.close();
System.out.println("4.关闭套接字和流成功!");
} catch (IOException ex) {
System.out.println("异常信息"+ex.getMessage());
}
}
}
详细解释
一个简单的客户机服务器模型:
客户机:
package network_chap01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
public class EchoClient {
public static void main(String[] args) {
Socket clientSocket = null;
BufferedReader in = null;
BufferedWriter out = null;
try {
//客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接
clientSocket = new Socket();
SocketAddress remoteAddr=new InetSocketAddress("localhost",5000);
System.out.println("1.创建客户机套接字成功!");
//Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。
//如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信
clientSocket.connect(remoteAddr);
System.out.println("2.客户机连接服务器localhost端口5000成功!");
System.out.println("客户机使用的地址和端口:"+clientSocket.getLocalSocketAddress());
//与服务器会话 ,建立一个输入流和输出流用于输出和输入服务端传来的字节流
in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
out = new BufferedWriter(
new OutputStreamWriter(
clientSocket.getOutputStream()));
System.out.println("请输入发给客户机的字符串:");
//用于读取键盘传输的文字
BufferedReader localReader=new BufferedReader
(new InputStreamReader(System.in));
String sendStr=localReader.readLine();
//String sendStr="有朋自远方来";
//向服务器发送字符串(向服务端写入)
out.write(sendStr);
//按换行读取,从当前位置一直读取数据,直到遇到换行符,然后去掉换行符,返回读取到的数据
out.newLine();
//把缓冲区的内容强制的写出
out.flush();
System.out.println("向服务器发送字符串成功!发送内容为:"+sendStr);
String recvStr=in.readLine(); //从服务器接收字符串
System.out.println("从服务器接收回送字符串成功!"+recvStr);
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
//关闭套接字和流
try {
if (in != null) in.close();
if (out != null) out.close();
if (clientSocket != null) clientSocket.close();
System.out.println("关闭套接字和流成功!");
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
}
}
服务器:
package network_chap01;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
public class EchoServer {
public static void main(String[] args) {
//1.启动服务器
ServerSocket listenSocket = null;
Socket clientSocket = null;
BufferedReader in = null;
BufferedWriter out = null;
try {
//实例化一个 ServerSocket 对象
listenSocket = new ServerSocket();
SocketAddress serverAddr=new InetSocketAddress("localhost",5000);
//通过绑定端口进行通信
listenSocket.bind(serverAddr);
System.out.println("EchoServer:服务器启动成功!开始在localhost的5000端口侦听连接...");
//服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口
clientSocket = listenSocket.accept();
System.out.println("EchoServer:客户机连接成功!客户机地址和端口:"+clientSocket.getRemoteSocketAddress());
//与客户机会话
in = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
out = new BufferedWriter(
new OutputStreamWriter(
clientSocket.getOutputStream()));
String recvStr=in.readLine(); //从客户机接收字符串
System.out.println("EchoServer: 服务器收到字符串:"+recvStr);
out.write(recvStr); //向客户机回送字符串
out.newLine();
out.flush();
System.out.println("EchoServer:echo:"+recvStr);
} catch (IOException ex) {
System.out.println("异常信息:"+ex.getMessage());
}
//4.关闭套接字和流
try {
if (in != null)in.close();
if (out != null) out.close();
if (listenSocket != null) listenSocket.close();
if (clientSocket != null) clientSocket.close();
System.out.println("EchoServer:关闭套接字和流成功!");
} catch (IOException ex) {
System.out.println("异常信息"+ex.getMessage());
}
}
}