600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > java 网络编程(二) tcp传输实现客户端和服务端进行信息交流

java 网络编程(二) tcp传输实现客户端和服务端进行信息交流

时间:2019-12-13 23:50:49

相关推荐

java 网络编程(二) tcp传输实现客户端和服务端进行信息交流

1、使用Tcp从一台电脑往另一台电脑上发送文本数据

客户端:

import java.io.*;import .*;/**** 客户端,* 通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。* 因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功。* 形成通路后,在该通道进行数据的传输* * * 需求:给服务端发送给一个文本数据* * 步骤:* 1、创建Socket服务,并指定要连接的主机和端口*/public class TcpClient {public static void main(String[] args) throws Exception{//创建客户端的socket服务,指定目的主机和端口Socket s = new Socket("10.101.76.80", 10003);//这里不明白的看前面的博客//为了发送数据,应该获取socket流中的输出流OutputStream out = s.getOutputStream();out.write("tcp ge men lai le".getBytes());//发送的内容s.close();}}

服务端

import .*;import java.io.*;/**** 服务端:* 1、建立服务端的socket服务,ServerSocket(),并监听一个端口。* 2、获取连接过来的客户端对象*通过ServerSocket的accpt方法,没有连接就会一直等待,所以这个方法是阻塞式的。* 3、客户端如果发过来数据,那么服务端就要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。*并打印在控制台。* 4、关闭服务端(可选)*/public class TcpServer {/*** 需求:定义端点接收数据并打印在控制台上*/public static void main(String[] args) throws Exception{//建立服务端socket服务,并监听一个端口。ServerSocket ss = new ServerSocket(10003);//通过accept方法获取连接过来的客户端对象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();}}

使用时先运行服务端的程序,在运行客户端的程序。因为只有服务端开启后,客户端才能与之建立连接并发送数据。

2、实现客户端和服务端的互访

上面的程序运行后,服务端只是接收到客户端发送的消息并打印,但是服务端并没有给客户端任何反馈。

接下来的代码用来演示tcp传输的客户端和服务端的互访。

客户端:

import java.io.*;import .*;/**** 需求:客户端给服务端发发送数据,服务端收到后,给客户端反馈信息。*/public class TcpClient2 {/*** 客户端:* 1、建立socket服务,指定要连接的主机和端口* 2、获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。* 3、获取socket流中的输入流。将服务器反馈的数据获取到,并打印。* 4、关闭客户端。*/public static void main(String[] args) throws Exception{Socket s = new Socket("10.101.76.80",10004);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));}}

服务端:

import java.io.*;import .*;/**** @author 604*/public class TcpServer2 {/*** @param args the command line arguments*/public static void main(String[] args) throws Exception{ServerSocket ss = new ServerSocket(10004);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("哥们收到,你也好".getBytes());s.close();ss.close();}}

这样就实现了客户端和服务端之间进行交流。

3、练习

接下来我们可以做一个练习。

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

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

import .*;import java.io.*;/**** 分析:*客户端:*既然是操作设备上的数据,那么就可以使用I/O技术,并按照I/O的操作规律来思考。*源:从键盘录入*目的:网络设备,网络输出流。而且操作的是文本数据,可以选择字符流。*步骤:*1、建立服务*2、获取键盘录入*3、将数据发给服务端*4、然后去服务端返回大写数据*5、结束,关闭资源。*都是文本数据,可以加入字符流进行操作,同时提高效率,加入缓冲。*/public class TransClient {/*** @param args the command line arguments*/public static void main(String[] args) throws Exception{Socket s = new Socket("10.101.76.80",10005);//定义读取键盘数据的流对象。BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//定义目的,将数据写入到socket输出流。发给服务端。BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));//定义一个socket读取流,读取服务端返回的大写信息BufferedReader bufIn =new BufferedReader(new InputStreamReader(s.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();s.close();}}

服务端:

import java.io.*;import .*;/**** 服务端:* 源:socket*/public class TransServer {/*** @param args the command line arguments*/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输出流,并发送给客户端。BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line = bufIn.readLine()) != null){System.out.println(line);bufOut.write(line.toUpperCase());bufOut.newLine();bufOut.flush();}s.close();ss.close();}}

该例子容易出现的问题:客户端和服务端都莫名的等待对方。

这是因为客户端和服务端都有阻塞的方法。这些方法没有读到结束标记,那么就一直等,而导致两端都在等待。所以结束标记很重要。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。