问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java服务器接收客户端请求怎样实现的

发布网友 发布时间:2022-04-24 03:46

我来回答

2个回答

热心网友 时间:2022-04-13 08:57

服务器端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* Socket通讯服务器端
* @author 米强
*
*/
public class ServerMain {

public ServerMain() {
try {
// 构造服务器ServerSocket对象,参数为服务器端开放的端口号
ServerSocket ss = new ServerSocket(30102);
System.out.println("服务器准备就绪!");
// 死循环可以使服务器持续处于接收客户端状态
while(true){
// 该方法使程序阻塞,等待客户端的链接,当监听到客户端的链接,创建一个Socket对象与客户端单独会话
Socket s = ss.accept();
// 为了不影响服务器监听其它客户端,这里开启了一个线程,由线程处理与这个客户端的会话
new ServerThread(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new ServerMain();
}

}

/**
* 服务器端与客户端会话的线程
*/
class ServerThread extends Thread {
private Socket s = null;
private BufferedReader read = null;
private PrintStream print = null;

public ServerThread(Socket s) {
this.s = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
read = new BufferedReader(new InputStreamReader(s.getInputStream()));
print = new PrintStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 线程的运行run方法
*/
public void run() {
try {
String message = null;
// 这里循环可以使服务器持续的接收客户端信息。read.readLine()通过输入流读取一段字符串,赋值给message变量,如果message字符串不为“exit”则循环,否则结束循环
while (!(message = read.readLine()).equals("exit")){
// 将字符串前面添加“返回:”,再发回客户端
print.println("返回:" + message);
}
} catch (IOException e) {
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!s.isClosed()){
// 关闭Socket链接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}

客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
* Socket通讯客户端
* @author 米强
*
*/
public class ClientMain {

public ClientMain() {
try {
// 构造与服务器通讯的Socket对象,参数为服务器IP地址(String)和端口号(int),端口号需要和服务器端开放的端口号对应
Socket s = new Socket("192.168.1.100", 30102);
// 启动一个线程与服务器通讯,并把链接服务器的Socket对象传递过去
new LinkThread(s).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new ClientMain();
}

}

/**
* 与服务器通讯的线程
*/
class LinkThread extends Thread {
private Socket s = null;
// 输出流
private PrintStream out = null;
// 缓冲输入流
private BufferedReader in = null;
// 录入文字的Scanner对象
private Scanner scanner = null;

public LinkThread(Socket s) {
// 将Socket对象实例保存在全局变量中,因为run方法中我们还要用它断开链接
this.s = s;
try {
// 从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
out = new PrintStream(s.getOutputStream());
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 线程的运行run方法
*/
public void run() {
// 构造Scanner对象
scanner = new Scanner(System.in);
System.out.println("提示:如果要结束本次会话,请输入“exit”指令!");
try {
// 死循环可以使客户端不断的向服务器发送信息,不用担心循环无法结束,后面的return语句可以结束整个线程。
while(true){
// 提示用户输入文字
System.out.print("请输入:");
// 将用户输入的字符串保存在message变量中
String message = scanner.nextLine();
// 通过输出流发送字符串
out.println(message);
// 清空缓冲,强制输出
out.flush();
// 获取服务器返回的字符串
String str = in.readLine();
// 如果返回的字符串存在
if(str != null){
// 显示在控制台
System.out.println(str);
}else{
// 提示会话结束,并结束线程
System.out.println("本次会话结束!");
return;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 在 finally 代码块中无论如何都会执行下面代码:
try {
// 如果没有关闭Socket
if(!s.isClosed()){
// 关闭Socket链接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}

热心网友 时间:2022-04-13 10:15

import java.io.IOException;
import java.net.*;
import java.io.*;

public class TCPServer { //不能同时打开多个服务器端
public static void main(String[] args){
try {
ServerSocket ss=new ServerSocket(6620); //6620服务器断开号
System.out.println("Server has been started!");
while(true){
Socket s=ss.accept(); //accept是阻塞式方法 接受客服端请求 System.out.println("连接已经建立!");
DataInputStream bis=new DataInputStream(s.getInputStream());
DataOutputStream dos=new DataOutputStream(s.getOutputStream());

String st=null;

if((st=bis.readUTF())!=null){
System.out.println(st); //readUTF是阻塞式方法,此方法会阻塞其他的客服端访问
System.out.println("SocketID="+s.getInetAddress());
System.out.println("Socket Port="+s.getPort());
}

dos.writeUTF("This is a Server!");
bis.close();
dos.close();
s.close();
}

} catch (IOException e) {
e.printStackTrace();
}
}

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小鹏交付怎么评分 2024年5月趋乾黄道吉日 2024年5月哪天适合趋乾 2024年6月词讼黄道吉日 2024年6月哪天适合词讼 2024年8月成服黄道吉日 2024年8月哪天适合成服 2024年8月26日黄道吉日 百度识图在线识别这个人是 百度怎样识别明星是谁? 海绵城市都建什么 包钢股票前景如何 600010包钢股份这支股票我现在被套百分之六了,后市该怎么操作,适合做长 ... java服务器端“/“文件路径如何书写? java客户端和服务器端怎么运行 word稿纸设置 qq可以起什么名字 java 服务器怎样给客户端传输数据 用java编写app的服务器端,需要用到什么技术和框架 取什么名字好 昵称用什么好听 怎样将java计算器连接服务器端 该取什么名字好啊? 用java编写app的服务器端要学哪些东西 工作用什么网名最好? java服务器开发是做什么?和web端的区别是什么? ID怎么取好听? java服务器开发是做什么?和web端的区别? 该取什么名字好啊? Java用来编写客户端还是服务器端? 工作用什么网名最好? JAVA 服务器端数据处理问题 ID怎么取好听? 怎么把word文档弄成稿纸形式? JAVA服务端android客户端如何通信 word怎样用稿纸格式 Java中如何将数据保存到服务器端 魅族m710m可以下载微信吗? WORD 稿纸模板问题 小兔子乖乖的听课总结? 嘴馋的小兔乖乖的教案 怎么教儿童歌曲 看图说话小动物们听小兔子讲故事 vivox60怎么拍月亮? 夹臂夺匕首教案 表演故事小兔乖乖时没有人愿意演大灰狼,说大灰狼是坏蛋,作为教师你怎么做? 怎样做好一名合格的幼儿园老师 怎样用vivo IQOO手机中的相机拍今晚的月亮? vivox9i怎么拍月亮? 房子装修,厨房的下水道位置可以改吗?怎么改好? 淘宝卖家的帐号跟买家的是一样的吗 ⅥV0x9手机市场价多少钱? 厨房下水道能移位吗?