练习:
1. 客户端和服务端建立socket连接;
2. 客户端发送字符给服务端,在“over”时结束输入;
3. 客户端打印输入的值,并打印服务端发送的返回值的大写.
答案如下:
客户端代码及其说明:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class test1 {
/*客户端输入字符串数据,发送给服务端
服务端受到数据后打印在控制台,并将字符串转换成大写返回给客户端
直到客户端输入over,转换结束
*/
public static void main(String[] args) throws IOException {
// 1.创建客户端socket,关联目的
Socket socket = new Socket("127.0.0.1",10011);
// 2.获取键盘输入,客户端的数据源
// 操作的是文本数据,使用InputStream将字节流转换为字符流
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
// 3.socket的输出流,客户端的目的:socket
// PrintWriter和BufferedWriter功能类似,将文本写入字符输出流
// PrintWriter的优点是可以自动刷新,不必flush,且可以直接操作字节流
// Socket编程中,尽量用PrintWriter取代BufferedWriter,下面是PrintWriter的优点:
// 1. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串;
// 2. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法;
// 3. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生;
// 4. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush);
// 5. PrintWriter的构造方法更广。
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
// 4.socket输入流,用于读取服务端的返回值
BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 将键盘输出写入socket输出流,发给服务端
// 判断键盘输入,在遇到"over"时退出
String line = null;
while((line=bufr.readLine())!=null) {
if ("over".equals(line))
break;
// 按行打印键盘输入
// 此处println的用途相当于BufferredWriter中的print/write + flush。
out.println(line);
// 按行打印服务端返回值
String upperStr = bufIn.readLine();
System.out.println(upperStr);
}
socket.close();
}
}
服务端代码及其说明:
package socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class upperSocketServer {
public static void main(String[] args) throws IOException {
// 1.创建服务
ServerSocket ss = new ServerSocket(10011);
// 2.获取socket对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"is connnected.");
// 3.获取socket读取流,并装饰
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 4.获取socket输出流,并装饰
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
// 读取socket发来的内容,不为空时进行处理:
// 1). 按行打印
// 2). 转大写后返回给输出流
String line = null;
while((line=bufIn.readLine())!=null){
System.out.println(line);
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
结果验证:
客户端验证结果:
fasfd
FASFD
cease
CEASE
ceasdcvas
CEASDCVAS
over
Process finished with exit code 0
服务端验证结果:
127.0.0.1is connnected.
fasfd
cease
ceasdcvas
Process finished with exit code 0
说明:
PrintWriter和BufferedWriter功能类似,将文本写入字符输出流.PrintWriter的优点是可以自动刷新,不必flush,且可以直接操作字节流. Socket编程中,尽量用PrintWriter取代BufferedWriter,下面是PrintWriter的优点: 1. PrintWriter的print、println方法可以接受任意类型的参数,而BufferedWriter的write方法只能接受字符、字符数组和字符串; 2. PrintWriter的println方法自动添加换行,BufferedWriter需要显示调用newLine方法; 3. PrintWriter的方法不会抛异常,若关心异常,需要调用checkError方法看是否有异常发生; 4. PrintWriter构造方法可指定参数,实现自动刷新缓存(autoflush); 5. PrintWriter的构造方法更广。