上一篇博客中,我们了解了基于UDP协议下的发送与接收信息并完成了简单的java代码实现工作,也在其中引用了一些前辈的博客来区分了UDP协议和TCP协议。那么今天咱们就一起来看一下基于TCP协议完成数据的发送与接收服务。
关于UDP的java实例可以戳基于UDP协议发送和接收信息的简单Java实例
主要步骤如下:
1、客户端发送数据
2、服务端接收数据
3、服务端转换数据
4、服务端发出数据
5、客户端接收数据
因为客户端发送数据和服务端接收数据以及客户端接收数据和UDP协议中的是一致的,包括创建Socket对象,创建数据,发送数据,接收数据等;因此便不再这里过多赘述,如有需要可查看上方UDP中内容,这里有详细步骤,剩下的我们在注释中体现。
客户端代码:
package com.zzxtit.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.Socket;
/**
*author 秦飞阳
*/
public class UserClient {
public static void main(String[] args) throws IOException {
//创建客户端Socket对象
Socket s = new Socket("127.0.0.1", 8888);
//创建输入流对象,读取键盘录入的信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名");
String username = br.readLine();
System.out.println("请输入密码");
String password = br.readLine();
// PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//创建输出流对象
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//将键盘录入的字符串输出到服务端
out.write(username);
out.write(password);
//创建输入流对象,接收服务端发送过来的数据
BufferedReader serverBr = new BufferedReader(new InputStreamReader(s.getInputStream()));
//读取内容
String result = serverBr.readLine();
//输出结果
System.out.println(result);
//关闭资源
s.close();
}
}
服务端代码:
package com.zzxtit.tcp;
import java.io.BufferedOutputStream;
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;
/**
*author 秦飞阳
*/
public class UserServer {
public static void main(String[] args) throws IOException {
//创建服务端Socket对象
ServerSocket ss = new ServerSocket(8888);
//接收对象,用到了accept方法
Socket s = ss.accept();
//创建输入流对象,接收来自客户端的数据内容
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//获取内容
String username = br.readLine();
String passeord = br.readLine();
//判断是否正确
boolean flag = false;
if("manxiaoyu".equals(username)&&"123456".equals(passeord)) {
flag = true;
}
// PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//创建输出流对象
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//将登陆结果输出到客户端
if (flag) {
out.write("登录成功");
} else {
out.write("登录失败");
}
//关闭资源
s.close();
//ss.close();
}
}
好了,结束,在这里需要注意的和UDP差不多,但又有所区别:
1、端口不能重复绑定,否则会报错cannot bind
2、因为是建立连接的,所以可以"实时通信",如完成字母大小写转换,登录,注册等
3、在创建输出流对象的时候可以使用BufferedWriter,也可以使用PrintWriter,只是后者自带换行,且方法要用print
下面有一个基于tcp实现用户输入一个字符串,服务端返回一个相应大写字符串的案例,大家如果感兴趣可以看一看