概述
目录
一、Socket
二、TCP编程
服务器端
创建Socket
建立与客户端的连接
读取数据
发送数据
客户端
创建Socket
发送数据
接受数据
一、Socket
Socket是一个抽象概念,一个应用程序可以通过Socket来建立远程连接。使用Socket进行网络编程,本质就是就是两个进程之间的网络通信,一个进程充当服务器,监听某个指定端口,一个进程充当客户端,连接服务器的IP地址和端口,如果连接成功,就成功建立一个TCP连接,就可以随时接受和发送数据。
二、TCP编程
服务器端
1.创建Socket
java标准库提供了ServerSocket类来实现对指定IP和指定端口的监听。
2.建立与客户端的连接
通过accept()方法返回的Socket的示例,建立一个与客户端的新连接。如果没有客户端连接进来,accept()方法会阻塞并一直等待。
3.读取数据
通过调用socket的getInputStream方法,然后调用read方法读取客户端发送过来的数据
4.发送数据
通过调用getOutputStream方法,然后调用write方法将数据发送出去
public static void main(String[] args) {
List<String> heroArray = new ArrayList<String>(
Arrays.asList("猪八戒","孙悟空","貂蝉","程咬金","妲己","安琪拉","吕布","鲁班七号","王昭君","西施"));
try (ServerSocket socket = new ServerSocket(8855)) {
// 死循环:不断接受客户端的连接
while(true) {
// 客户端连接
// 服务器进入"等待"状态
// 如果有客户端连接时,该方法返回此客户端的Socket
Socket client = socket.accept();
// 获取该用户姓名
try(BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));){
String name = reader.readLine();
String hero = heroArray.get((int)(Math.random() * heroArray.size()));
String originalHero = String.format("经过层层分析:%s您的本命英雄是%s", name, hero);
// 发送答案至客户端
writer.write(originalHero);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户端
1.创建Socket
创建一个Socket对象,传入本地IP地址和端口号
2.发送数据
通过调用socket的getOutputStream方法,然后调用write方法将数据发送出去。使用flush()将缓冲区中的内容强制输出,然后调用shutdownOutput()方法将输出流关闭,这样数据才能真正发送发出去。
3.接受数据
通过调用socket的getInputStream方法,然后调用read方法读取客户端发送过来的数据
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// Socket : 客户端进行通信的组件
try (Socket client = new Socket("192.168.254.176", 8855);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()))) {
System.out.print("请输入你的真实姓名:");
String name = input.nextLine();
// 发送姓名至服务端
writer.write(name);
writer.flush();
// 暂时结束本次输出(Socket没有关闭)
client.shutdownOutput();
// 获取来自服务端的答案
String answer = reader.readLine();
System.out.println(answer);
} catch (IOException e) {
e.printStackTrace();
}
}
注:将输入流、输出流、socket流 代码写入try()块里,等到代码运行结束后,会自动调用close方法将其流关闭,无需手动调用。
最后
以上就是精明大树为你收集整理的基于TCP的网络编程一、Socket二、TCP编程的全部内容,希望文章能够帮你解决基于TCP的网络编程一、Socket二、TCP编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复