使用Java实现简单的server/client回显功能的方法介绍_基础知识
Socket是指在一个特定编程模型下,进程间通信链路的端点。因为这个特定编程模型的流行,Socket这个名字在其他领域得到了复用,包括Java叫技术。
如果要建立连接,一台机器必须运行一个进程来等待连接,而另一台机器必须试图到达第一台机器。这个电话系统类似:一方必须发起呼叫,而另一方在此时必须等待电话呼叫。
java网络模型图
下面通过一个有“回显”功能的服务器和客户端来介绍应用java.net包编写网络应用程序。
这个例子主要功能是服务器端的程序等待客户的输入,然后将读取到的信息回显给客户端,同时在服务器端的控制台输出。而客户端从控制台接收信息后,向客户端发送输入,并接收服务器的回显数据,然后显示在控制台。
客户端程序代码如下:
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* Description: 具有“回显”功能的服务器端和客户端程序
*/
public class EchoClientDemo {
// 服务器端的服务端口。
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 建立连接套接字。
Socket s = new Socket("localhost",SERVERPORT);
System.out.println("socket = " + s);
// 新建网络连接的输入流。
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
// 新建网络连接的自动刷新的输出流。
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
// 先使用System.in构造InputStreamReader,再构造BufferedReader。
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a string, Enter BYE to exit! ");
while (true) {
// 读取从控制台输入的字符串,并向网络连接输出,即向服务器端发送数据。
out.println(stdin.readLine());
// 从网络连接读取一行,即接收服务器端的数据。
String str = in.readLine();
// 如果接收到的数据为空(如果直接按Enter,不是空数据),则退出循环,关闭连接。
if (str == null) {
break;
}
System.out.println(str);
}
s.close();
} catch (IOException e) {
System.err.println("IOException" + e.getMessage());
}
}
}
上面客户端程序中。首先用java.net包中的Socket类建立一个连接套接字,其后应用的Socket对象的getInputStream方法从服务器接收数据,并且应用Socket对象的getOuputStream方法发送数据到服务器。创建完输入输出流,就可以像读写文件的方式来读写数据。
支持多客户端的“回显”服务器端程序代码如下:
package com.javapp.ch11;
import java.io.*;
import java.net.*;
/**
* Description:支持多客户端的“回显”服务器端程序
*/
public class EchoServerThreadDemo {
// 服务器端的服务端口。
public static final int SERVERPORT = 990;
public static void main(String[] args) {
try {
// 已经连接上的客户端的序号。
int number = 1;
// 建立服务器端倾听套接字。
ServerSocket s = new ServerSocket(SERVERPORT);
System.out.println("Started: " + s);
while (true) {
// 等待并接收请求,建立连接套接字。
Socket incoming = s.accept();
System.out.println("Connection " + number + " accepted: ");
System.out.println(incoming);
// 启动一个线程来进行服务器端和客户端的数据传输。
// 主程序继续监听是否有请求到来。
Thread t = new EchoThread(incoming,number);
t.start();
number++;
}
} catch (IOException e) {
System.err.println("IOException");
}
}
}
class EchoThread extends Thread {
private Socket s;
int n;
public EchoThread(Socket incoming,int number) {
s = incoming;
n = number;
}
public void run() {
try {
// 新建网络连接的输入流。
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream()));
// 新建网络连接的自动刷新的输出流。
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(s.getOutputStream())),true);
System.out.println("Hello! Enter BYE to exit.");
// 回显客户端的输入。
while (true) {
// 从网络连接读取一行,即接收客户端的数据。
String line = in.readLine();
// 如果接收到的数据为空(如果直接按Enter,不是空数据),则退出循环,关闭连接。
if (line == null) {
break;
} else {
if (line.trim().equals("BYE")) {
System.out.println("The client " + n + " entered BYE!");
System.out.println("Connection " + n + " will be closed!");
break;
}
System.out.println("Echo " + n + ": " + line);
// 向网络连接输出一行,即向客户端发送数据。
out.println("Echo " + n + ": " + line);
}
}
// 关闭套接字。
s.close();
} catch (IOException e) {
System.err.println("IOException");
}
}
}
在服务器端程序中,首先用java.net包中的ServerSocket类创建一个服务器端侦听套接字。其后应用ServerSocket类的accept方法等待并接收用户请求。当服务器每接收到一个连接请求后,就启动一个线程来单独处理服务器和客户端的数据传输。服务器端数据的接收和发送与上面介绍的客户端数据的发送和介绍相同。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

WindowsServerBackup是WindowsServer操作系统自带的一个功能,旨在帮助用户保护重要数据和系统配置,并为中小型和企业级企业提供完整的备份和恢复解决方案。只有运行Server2022及更高版本的用户才能使用这一功能。在本文中,我们将介绍如何安装、卸载或重置WindowsServerBackup。如何重置Windows服务器备份如果您的服务器备份遇到问题,备份所需时间过长,或无法访问已存储的文件,那么您可以考虑重新设置WindowsServer备份设置。要重置Windows

在发布WindowsServer的build26040版本之际,微软公布了该产品的官方名称:WindowsServer2025。一同推出的,还有Windows11WindowsInsiderCanaryChannel版本的build26040。有些朋友可能还记得,多年前有人成功将WindowsNT从工作站模式转换为服务器模式,显示微软操作系统各版本之间的共性。尽管现在微软的服务器操作系统版本和Windows11之间有明显区别,但关注细节的人可能会好奇:为什么WindowsServer更新了品牌,

如何修改nginx默认的名称,可以稍微的伪装一下,也可以装x一般来说修改3个位置,一个是nginx.h、另一个是ngx_http_header_filter_module.c、还有一个ngx_http_special_response.c。提示:一般修改都是在nginx编译之前修改,修改完了之后需要重新编译代码如下:scr/core/nginx.conf#definenginx_version"1.4.7"#definenginx_ver"nginx/"n

微软在面向桌面端发布Win11预览版更新的同时,今天还发布了WindowsServer长期服务通道(LTSC)预览版Build25335。微软和以往相同,并未公布完整的更新日志,甚至于没有提供相应的博客文章。微软调整了WindowsServer预览版更新日志,让其和Canary频道版本相同,如果没有引入新的内容,则不放官方博文。IT之家注:Server的品牌尚未更新,在预览版中仍为WindowsServer2022。此外,微软将这些版本称为WindowsServervNext,而不是已经上市的W

IT之家3月14日消息,微软今天面向桌面端发布Windows11Build26080预览版更新之外,还更新推出了WindowsServerBuild26080预览版更新。作为即将推出的WindowsServer长期服务通道(LTSC)的最新预览版,WindowsServerBuild26080提供了数据中心版和标准版,用户可以选择桌面体验和服务器核心安装选项。此版本还包括容器主机的年度通道,以及专门用于虚拟机评估的Azure版本。IT之家查询X社交媒体,用户反馈点击右下角的Copilot按钮,会

server的匹配逻辑nginx在决定请求由哪个server块执行时,主要关注的是server块中的listen和server_name两个字段listen指令listen字段定义server响应的ip和端口,如果没有明确配置listen字段,默认监听0.0.0.0:80(root)或者0.0.0.0:8080(非root)listen可以被配置为:一个ip和端口的组合一个单独的ip,默认监听80端口一个单独的端口,默认监听所有的ip接口一个unixsocket路径其中最后一项通常只用于在不同的

如果你认为安装UbuntuServer11.04版完全没必要装图形界面,更没有必要装目前还不是很完善的GNOME3。。或者应该用ARCH+GNOME3搭建。那么请别继续浪费时间看下去。前后花了2个晚上和一个白天,重装了N次。终于有点成果了。不容易啊。废话少说,正题:硬件:ThinkPadX61一只,UbuntuServer11.04安装U盘一只上网:ADSL(无线,有线)操作:伪程序猿一枚1.插入U盘,重启笔记本,狂按F12。(针对X61)2.进入启动选项界面,选择USB启动,然后选择安装Ubu

firewall防火墙firewalld服务有CLI和GUI两种工作模式。相较于iptables,firewall支持动态更新,并引入了区域(zone)的概念。简而言之,区域是指防火墙预先定义的一组防火墙策略,使得防火墙之间可以快速切换这些策略,从而显着提高了防火墙的切换效率和应用速度。区域默认策略规则trusted允许所有数据包home拒绝流入流量,但是与ssh,mdns,ipp-client,dhcpv6-client服务则允许通过internal等同于home区域work拒绝流入流量,但是
