赞
踩
Socket chatSocket = new Socket("127.0.0.1", 5000);
创建Socket的时候需要用到两个重要的参数,一个是IP地址,另外一个是端口号。IP地址可以理解成网络中特定位置的计算机(服务器相当于一台连续工作的计算机),端口号对应于计算机中特定的服务或者应用。
这里的IP地址127.0.0.1是本机回送地址,属于保留地址,专门用来测试的。端口号可以在1024~65535之间任选。
InputStreamReader stream = new InputStreamReader(chatSocket.getInputStream());
InputStreamReader在底层二进制字节流和上层的字符串流之间建立了一座“桥梁”。
BufferedReader reader = new BufferedReader(stream);
String message = reader.readLine();
将BufferedReader连接到InputStreamReader。
向Socket中写入数据,也就是要将数据传送到服务器上
Socket chatSocket = new Socket("127.0.0.1", 5000);
PrintWriter writer = new PrintWriter(charSocket.getOutputStream());
同样,PrintWriter在自己与底层输出流之间建立了一座“桥梁”,所以我们只需要向其写入String类型的字符串,就能自动转变为输出的二进制流。
writer.println("message to send");
writer.print("message to send");
println()
方法会插入一个新行,而print()
方法不会。
下面是一个简单的例子,客户端从服务器读取数据,并打印到控制台
public class DailyAdviceClient {
public void go(){
try {
Socket s = new Socket("127.0.0.1", 4242);
InputStreamReader streamReader = new InputStreamReader(s.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
String advice = reader.readLine();
System.out.println("Today you should: " + advice);
reader.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new DailyAdviceClient().go();
}
}
ServerSocket serverSocket = new ServerSocket(4242);
创建后,服务器开始监听端口4242上的请求。
2. 客户端创建Socket与服务器连接
Socket socket = new Socket("190.165.1.103", 4242);
创建链接时客户端需要知道IP地址和端口号。
3. 服务器创建一个新的Socket与客户端进行通讯
Socket socket = serverSocket.accept();
服务器调用accept()
方法后,进入阻塞状态,等待客户端的连接。当收到客户端的请求后,服务器会在另外的端口创建一个新的Socket与客户端进行通信,这样原端口就可以空出来等待下一次请求。
代码如下:
public class DailyAdviceServer {
String[] adviceList = {
"Take smaller bites",
"Go for the tight jeans. No they do not make you fat.",
"One word: inappropriate",
"Just for today, be honest. Tell your boss what you *really* think",
"You might want to rethink that haircut." };
public void go(){
try {
ServerSocket serverSocket = new ServerSocket(4242);
while(true){
Socket sock = serverSocket.accept();
PrintWriter writer = new PrintWriter(sock.getOutputStream());
String advice = getAdvice();
writer.println(advice);
writer.close();
System.out.println(advice);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getAdvice(){
int random = (int) (Math.random() * adviceList.length);
return adviceList[random];
}
public static void main(String[] args) {
new DailyAdviceServer().go();
}
}
注意,我们将accept()
方法的调用放在了一个死循环中,只有服务器接收到了客户端的请求,循环才会继续往下执行。这时候accept()
方法返回了一个新的Socket,用来与客户端进行通信。如果想同时处理多个请求,应当为每一个Socket新建一个线程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。