JAVA从入门到进阶(十三)——Tcp/ip通信的实现

需求:模拟一个大小转换器
将键盘输入的小写字母提交到服务器上转化为大写字母并打印
客户端:

package Intenetprogress;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;



public class Tcpipclientbuilde2 {
public static void main(String []args) throws IOException, IOException
{
	/*
	 * 客户端需求
	 * 1,将键盘输入的数据打印在控制台上
	 * 2.上传到服务端,由服务端把数据转化为大写
	 * 3.由服务端把转化为大写的数据发回到客户端
	 * 4客户端收到数据,并将数据打印到控制台上
	 */
	//1创建客户端的源
	Socket s=new Socket(InetAddress.getLocalHost(),10000);
	//2创建带缓冲区的转化流使键盘读取的数据可以高效,可以用字符缓冲区流的特有
	//方法来操作数据,使数据易于处理
	BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
	//3①读取由键盘录入的数据
	   //②获取socket输出流对象,将键盘录入的数据发送到服务端
	PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
	//读取服务器传输的数据
	BufferedReader bfrin=new BufferedReader (new InputStreamReader(s.getInputStream());
	String str=null;
	while((str=bfr.readLine())!=null)
	{
		if(str.equals("over"))
			break;
		pw.println(str);
		String test=bfrin.readLine();
		System.out.println(test);
		
	}
	s.close();
}
}

服务端:

package Intenetprogress;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPipservebuilde2 {
public static void main(String []args)
{
	/*
	 * 步骤
	 * 1,创建服务端socket源
	 * 2.获取客户端对象
	 * 3.获取客户端对象的读取流,进行对客户端数据的读取
	 * 4.把客户端的数据转化为大写发送到客户端
	 * ①获取服务端的输出流
	 * ②写出数据
	 */
	ServerSocket ss=new ServerSocket(10000);
	Socket s=ss.accept();
	BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream());
    PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
	String line=null;   
    while((line=br.readLine())!=null)
    {
    	System.out.println(line);
    	pw.println(line.toUpperCase());
    }
    s.close();
    ss.close();
}
}

要点
①PrintWriter流可以接受字节或字符流对象,其中的println方法中有多种形参。可以保证输出的数据类型不改变。

②readline 方法是阻塞塞方法,只有读到换行标记时会返回数据
③printwriter中的println方法中自动在结尾调用print(),print()就是进行一次回车
如果在printwrite构造方法加上true,则会在println等方法后调用flush
④每次调用输出时记得刷新,否则只存到流的缓冲区中,而没有传输

你可能感兴趣的:(java从菜鸟到进阶)