java之 23天 TCP 网络编程 (二)
2017-03-27 11:24
316 查看
TCP一次传输
TCP的传输的客户端和服务端的互访
TCP服务端转换客户端文本
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * TCP传输 * Socket 和ServerSocket * 建立客户端和服务器端 * 建立连接后,通过Socket中的IO流进行数据的传递 * 关闭Socket * 同样,客户端与服务器端是两个独立的应用程序. * * 客户端: * 通过查阅socke对象,发现在该对象建立的时候,就可以去连接指定的主机. * 因为tcp是面向连接的,所以在建立socket的服务时,就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输. * * 步骤 * 1.创建Socket服务,并指定要连接的主机和端口,必须要启动服务器端监听 * 2.然后创建 客户端,然后开始交流 * * 需求:给服务端发送一个文本数据 * */ class TcpClient{ public static void main(String[] args) throws IOException{ Socket s=new Socket("192.168.1.121",10000); OutputStream out=s.getOutputStream(); out.write("tcp 哥们来了".getBytes()); s.close(); } } /** * 需求:定义端点接受数据并打印在控制台上 * 服务端: * 1.建立服务器端的socket服务, ServerSocket() * 并监听一个端口. * 2. 获取连接过来的客户端对象. * 通过ServerScoket的accept方法,所以这个方法是阻塞式的 * 3.客户端如果发来数据,那么服务端要使用对应的客户对象,并获取到该客户端对象的读取流读取发过来的数据 * 并打印在控制台. * 4.关闭服务器 (可选) * * */ class TcpServer{ public static void main(String[] args) throws IOException{ //建立服务端socket服务,并监听一个端口 ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+"....connected"); //获取客户端发送过来的额数据,那么要使用客户端对象的读取流来读取数据 InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); System.out.println(new String(buf,0,len));//关闭客户端 s.close(); ss.close(); } }
TCP的传输的客户端和服务端的互访
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * 演示 tcp的传输的客户端和服务端的互访 * * 需求:客户端给服务端发送数据,服务端接手后,给客户端反馈系信息 * * 客户端: * 1.建立Socket服务,指定要连接主机和端口 * 2.获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端 * 3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印 * 4.关闭资源 */ class TcpClient2{ public static void main(String[] args) throws IOException{ Socket s=new Socket("192.168.1.121",10000); OutputStream out=s.getOutputStream(); out.write("服务端,你好吗?".getBytes()); InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } } class TcpServer2{ public static void main(String[] args) throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+".....connected"); InputStream in=s.getInputStream(); byte[] buf=new byte[1024]; int len=in.read(buf); System.out.println(new String(buf,0,len)); OutputStream out=s.getOutputStream(); out.write("我很好,thankyou!".getBytes()); s.close(); ss.close(); } }
TCP服务端转换客户端文本
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; /** * * 需求:建立一个文本转换服务器 * 客户端给服务端发送一个,服务端会将文本转成大写再返回给客户端. * 而且客户端可以不端的进行文本转换.当客户端输入over时,转换结束. * * * 分析 * 客户端: * 既然是操作设备上的数据,就可以使用io技术,并按照io的操作规律来思考 * 源:键盘录入 * 目的:网络设备,网络输出流. * 可以操作的是文本数据,可以选择字符流 * * 步骤: * 1.建立服务 * 2.获取键盘录入 * 3.将数据发送给服务端 * 4.获取服务端的的反馈数据 * 5.结束,关资源 * 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲. * * * 该例子出现的问题: * 现象:客户端和服务端都在莫名的等待. * 为什么呢? * 因为客户端和服务端都有阻塞式方式,这些方法么有读取到结束标记, * 那么就一直等.而导致两端都在等待. * */ class TransClient{ public static void main(String[] args) throws IOException{ Socket s=new Socket("192.168.1.121",10000); BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); //BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //优化 PrintWriter out=new PrintWriter(s.getOutputStream(),true); BufferedReader bufrs=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; while((line=bufr.readLine())!=null){ if("over".equals(line)) break; out.println(line); /* bufw.write(line); bufw.newLine(); //缓冲区的 读取结束标记 bufw.flush();*/ String str=bufrs.readLine(); System.out.println("Server:"+str); } bufr.close(); s.close(); } } class TransServer{ public static void main(String[] args) throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); String ip=s.getInetAddress().getHostAddress(); System.out.println(ip+"....connected"); //读取socket流中的数据 BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream())); //目的Socket输入流,将大写的写入到socket输出流,并发给客户端 //BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //优化 PrintWriter out=new PrintWriter(s.getOutputStream(),true); String line=null; while((line=bufr.readLine())!=null){ System.out.println(line); out.println(line.toUpperCase()); /* bufw.write(line.toUpperCase()); bufw.newLine(); //缓冲区的 读取结束标记 bufw.flush();*/ } s.close(); ss.close(); } }
相关文章推荐
- Java基础23天--05--网络编程(TCP和UDP)
- java网络编程之TCP
- Java TCP网络编程 - 最简单示例
- Java基础23天--01/02--网络编程
- java基础学习-- 网络编程之TCP和UDP
- Java 网络编程 TCP vs UDP
- Java 网络编程之 (基于 TCP 的远端文件传输)
- Java基础24天--01--网络编程(TCP--上传图片)
- Java网络编程之TCP协议下—上传文件到服务器程序
- JAVA网络编程入门的两个demo(TCP+UDP)
- Java 网络编程之 (TCP传递对象)
- Java网络编程之TCP(一)
- Java基础23天--04--网络编程
- Java的网络编程(TCP/IP)
- JAVA网络编程入门的两个demo(TCP+UDP)
- Java网络编程之传输控制协议TCP(三)
- Java 网络编程之 (TCP服务器架构)
- JAVA网络编程入门的两个demo(TCP+UDP)
- java网络编程自学(三)-TCP/IP+NIO
- Java基础24天--02--网络编程(TCP--客户端并发上传图片)