1、java服务器接收客户端请求怎样实现的
服务器端代码:
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();
}
}
}
}
2、页面加载完成发起请求到服务器代码怎么写
用js呗
window.onload = funtion(){
这里写请求到服务器的代码,ajax,页面加载完成,离开等都有对应的事件,你只要查一下对应的事件是什么,业务逻辑写在对应的事件的方法就可以调到了
}
3、请求服务器超时?
您好,您要看具体报错信息哦。如果是租用的服务器可以联系供应商重启,最简单直接。
4、http协议中关于"请求"概念的一句话。不太理解,请指点。"浏览器根据网址向对应的服务器发送请求"
你要访问京东,你的浏览器就会向京东的服务器发送“请求”,京东的服务器收到你浏览器的“请求”后,会给你的浏览器一个反馈是否同意你的“请求”,如果同意,京东的服务器就会把“请求”的数据发送给你的浏览器,你的浏览器就会把它显示出来。
HTTP不发送请求,HTTP是网络协议。HTTP是一个客户端和服务器端请求和应答的标准。网页链接。想要深入了解的话,可以看看《HTTP权威指南》等HTTP方面的书籍。
5、如何给http服务器发送post请求
1、HTTP请求概述
在前面有一篇文章对HTTP协议有详细的描述,这里就不再过多的做说明,只是简单的作为这篇文章的引子。
HTTP协议又被称为超文本传输协议,它的的设计目的是保证客户机与服务器之间的通信。HTTP 的工作方式是客户端与服务器之间的请求-应答协议。在客户端和服务器之间进行请求-响应时,有两个最基本的请求方式:GET 和 POST。
其中,GET请求表示从指定的资源请求数据,POST请求表示向指定的资源提交要被处理的数据。
2、HTTP请求格式
在HTTP请求中,首先是请求行,注意这里的请求行一定要放在最前面;其次,是请求头,英文表示为header;然后会空一行,紧接着就可以是请求的具体内容了,一般称之为请求体,request-body。给出一个图示如下:
3、GET请求与POST请求对比
GET请求与POST请求有一些异同点,主要有以下几点问题:
(1)、GET请求和POST请求都是客户端与服务器之间交互,请求--应答模式的协议
(2)、GET请求是通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的;
(3)、GET提交有数据大小的限制,一般是不超过1024个字节,而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限,而是浏
览器做了些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认
值。总体来说,少量的数据使用GET,大量的数据使用POST。
(4)、GET请求因为数据参数是暴露在URL中的,所以安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到登录操作的时候,尽量使用HTTPS请求,安全性更好。
下面给出一副图示,说明一下HTTP中GET与POST请求的差异:
4、使用步骤:
在Android中使用HTTP请求,主要步骤如下:
(1)、实例化一个HttpGet(或HttpPost)对象,将请求的URL地址通过构造方法传给HttpGet(或HttpPost)对象;
(2)、使用DefaultHttpClient类的execute方法发送GET或POST 请求,并返回HttpResponse对象;
(3)、通过HttpResponse接口的getEntity方法返回响应信息。
5、实例代码
给出一个在实际应用中的一个POST请求的代码片段:
[java] view plain copy print?
params = new LinkedList();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二个参数"));
try {
HttpPost post = new HttpPost(baseUrl);
post.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //将参数填入POST Entity中
HttpResponse response = httpClient.execute(post); //执行POST方法
resCode = response.getStatusLine().getStatusCode()); //获取响应码
result = EntityUtils.toString(response.getEntity(), "utf-8")); //获取响应内容
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
6、HTTP请求状态码意义
HTTP请求中,主要有这样几个类型:1XX:表示信息提示,2XX:表示成功,3XX:表示重定向,4XX:表示客户端请求错误,5XX:表示服务器错误。常见的几个HTTP请求状态码意义如下:
200 OK: 找到了该资源,并且一切正常。
304 NOT MODIFIED: 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
401 UNAUTHORIZED: 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
403 FORBIDDEN: 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
404 NOT FOUND: 在指定的位置不存在所申请的资源。
505 NOT SUPPORTED:服务器不支持请求中所指明的HTTP版本
6、服务器如何处理http请求
1.需求
了解服务端如何处理http请求,了解基本的处理流程
2.实战
处理http请求分为7个步骤
2.1 Tcp连接
建立一条tcp链接,(若之前不存在持久链接keep-alive),把客户端的ip和port,服务端的ip和port数据放到web服务器连接表中。服务器随时监听链接表中的链接,看有没有数据变化
2.2 接收http请求
一旦我们发送http请求了,这条tcp链接就开始工作了。因为web服务器链接表中有许多链接需要被处理,处理的方式有单线程,多线程这些(这些涉及操作系统的知识)。
2.3 处理http请求
处理的过程大致是把请求的信息解析出来,如下图
2.4 访问资源
访问资源可以是访问静态资源,这个就直接根据url地址去服务器里找就好了。
访问动态资源的话要经过一个叫cgi的东西,再用服务端脚本处理,再返回给前端。如下图所示
2.5 构建响应
要是找到资源,则构建响应信息,包括响应的对象类型,长度,状态码。
另一个情况是重定向响应,就是直接返回一个重定向,客户端看到之后,立刻再向重定向的地址发起请求。重定向的响应的状态码一般是3xx。
2.6 发送响应
把构建的响应发送给客户端
2.7 记录日志
服务端对这个请求响应过程进行记录。(另外专门再讲)
3.总结
以上是服务端处理http请求的大致过程。能让大家有个大致轮廓,当然里面有很多细节的知识没讲到,要另外查询资料并学习
7、服务器请求错误是啥意思
(1).请检查自己的网络是否正常连接。
(2).请关闭您的网络防火墙,防火墙有时会影响正常连接到服务器。
(3).如果您是通过局域网上网,无法连接服务器,那有可能是局域网服务器屏蔽了游戏所占用的端口,请与您的网
管联系。
(4).提供您上网服务的网络服务营运商的服务器不能连接到官方的服务器,请与您的网络服务营运商联系。
(5).服务器可能在关闭维护状态,请注意官方网站的公告以及官方论坛的消息。
8、向服务器发送请求有几种方式
你好。
用vs表单提交有两种方式
method = "post" || method = "get"
您也可以向我们团队发出请求,
会有更专业的人来为您解答。
如果我的回答没能帮助您,请继续追问。
9、服务器设置请求时间一般为多长,过长会有什么影响
设置60秒即可
在客户端访问浏览器的时候,有时候可能会因为某种原因导致访问堵塞,如果不设置超时的话就会变成资源浪费甚至服务器挂起,
比如说我要看我的数据库内有多少条记录,在你访问服务器 有服务器再去访问数据库,当访问数据库的时候要是卡住了,如果不设置超时,服务器就会一直将线程保持,然后一条条线程堆积下来,对应的资源也一直被这些卡住的线程持有,不得释放。最后的结果可想而知