|
三、TCP传输应用 1,tcp分客户端和服务端。 2,客户端对应的对象是Socket,服务端对应的对象是ServerSocket。 客户端: 通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。 因为tcp是面向连接的。所以在建立socket服务时, 就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。 package cn.itcast.net2; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TcpClient { public static void main(String[] args) throws UnknownHostException, IOException { //创建客户端的Socket服务,并制定服务器端的主机和端口 Socket s = new Socket("172.20.84.57",10005); //为了能够像服务端发数据,需要用Socket对象的 //getOutputStream()方法去获取OutputStream对象 OutputStream out = s.getOutputStream(); //通过out对象写数据给服务端 out.write("tcp ge men lai le ".getBytes()); //关闭资源 s.close(); } } 服务端: 1,建立服务端的socket服务。ServerSocket();并监听一个端口。 2,获取连接过来的客户端对象。通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。 3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。 4,关闭服务端。(可选) package cn.itcast.net2; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { public static void main(String[] args) throws IOException { //建立服务端对象,并监听一个端口 ServerSocket ss = new ServerSocket(10005); //通过accept方法获得客户端的对象 while(true){ Socket s = ss.accept(); //得到客户端对象后,获取其IP地址 String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + "......is connecting"); //获取客户端发来的数据,需要获取到客户端的读取流 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } } } 应用: 需求:建立一个文本转换服务器。 客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。 分析: 客户端: 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。 源:键盘录入。 目的:网络设备,网络输出流。 而且操作的是文本数据。可以选择字符流。 步骤 1,建立服务。 2,获取键盘录入。 3,将数据发给服务端。 4,获取服务端返回的大写数据。 5,结束,关资源。 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。 import java.io.*; import java.net.*; class TransClient { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.1.254", 10005); // 定义读取键盘数据的流对象。 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); // 定义目的,将数据写入到socket输出流。发给服务端。 PrintWriter out = new PrintWriter(s.getOutputStream(), true); // 定义一个socket读取流,读取服务端返回的大写信息。 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while ((line = bufr.readLine()) != null) { if ("over".equals(line)) break; out.println(line); String str = bufIn.readLine(); System.out.println("server:" + str); } bufr.close(); s.close(); } } class TransServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10005); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + "....connected"); // 读取socket读取流中的数据。 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); // 目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。 PrintWriter out = new PrintWriter(s.getOutputStream(), true); String line = null; while ((line = bufIn.readLine()) != null) { System.out.println(line); out.println(line.toUpperCase()); } s.close(); ss.close(); } }
|