TCP练习

需求:建立一个文本转换服务器。

    客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。

分析:

    客户端:

        既然是操作设备上的数据,那么就可以使用IO技术,并按照IO的操作规律来思考。

        源:键盘录入:

        目的:网络设备,网络输出流。

        而且操作的是文本数据,可以选择字符流。

    步骤:

        1、建立服务;

        2、获取键盘录入;

扫描二维码关注公众号,回复: 512738 查看本文章

        3、将数据发给服务端;

        4、获取服务端返回的大写数据;

        5、结束,关闭资源。

    都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。

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.Socket;
import java.net.UnknownHostException;

public class TransClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket socket=new Socket("10.1.9.34",20000);
		
		//定义读取键盘数据的流对象
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		//定义目的主机,将数据写入到socket输出流,发给服务端。
		BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
	
		
		//定义一个socket读取流,读取服务端返回的大写信息。
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
						
			bufOut.write(line);
			bufOut.newLine();//换行
			bufOut.flush();//刷新
			
			String str=bufIn.readLine();
			System.out.println("Server:"+str);
		}
		
		bufr.close();
		socket.close();
	}
}

    服务端:

        源:socket读取流;

        目的: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.ServerSocket;
import java.net.Socket;

public class TransServer {

	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket=new ServerSocket(20000);
		
		Socket socket=serverSocket.accept();
		
		String ip=socket.getInetAddress().getHostAddress();
		System.out.println(ip+"......connectted");
		
		//源:读取socket读取流中的数据
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		//目的:socket输出流将大写数据写入到socket输出流,并发送给客户端
		BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
		
		String line=null;
		while((line=bufIn.readLine())!=null){
			System.out.println(line);
			
			bufOut.write(line.toUpperCase());
			bufOut.newLine();//换行
			bufOut.flush();//刷新
		}
		
		socket.close();
		serverSocket.close();
		
	}
}

        运行结果为:

        


    在此过程中,出现的问题:

        现象:客户端和服务端都有阻塞式的方法(readline()),这些方法都没有读到结束标记,那么一直等待导致两端都在等待。

        解决办法:是在每个出现都加入两句话:

bufOut.newLine();//换行
bufOut.flush();//刷新

有另外一直简单的写法,把BufferedWriter替换成PrintWriter,也可达到同样的效果

客户端:

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.Socket;
import java.net.UnknownHostException;

public class TransClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket socket=new Socket("10.1.9.34",20000);
		
		//定义读取键盘数据的流对象
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		//定义目的主机,将数据写入到socket输出流,发给服务端。
		//BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
	
		PrintWriter out=new PrintWriter(socket.getOutputStream());
		
		//定义一个socket读取流,读取服务端返回的大写信息。
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			out.println(line);
			
//			bufOut.write(line);
//			bufOut.newLine();//换行
//			bufOut.flush();//刷新
			
			String str=bufIn.readLine();
			System.out.println("Server:"+str);
		}
		
		bufr.close();
		socket.close();
	}
}

    服务端:   

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.ServerSocket;
import java.net.Socket;

public class TransServer {

	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket=new ServerSocket(20000);
		
		Socket socket=serverSocket.accept();
		
		String ip=socket.getInetAddress().getHostAddress();
		System.out.println(ip+"......connectted");
		
		//源:读取socket读取流中的数据
		BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		//目的:socket输出流将大写数据写入到socket输出流,并发送给客户端
//		BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
		PrintWriter out=new PrintWriter(socket.getOutputStream());
		
		String line=null;
		while((line=bufIn.readLine())!=null){
			System.out.println(line);
			
			out.println(line);
//			bufOut.write(line.toUpperCase());
//			bufOut.newLine();//换行
//			bufOut.flush();//刷新
		}
		
		socket.close();
		serverSocket.close();
		
	}
}

猜你喜欢

转载自blog.csdn.net/pengzhisen123/article/details/80187334
tcp
今日推荐