想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?

想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?,第1张

服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetServerSocket;

import javanetSocket;

import javatextSimpleDateFormat;

import javautilArrayList;

import javautilDate;

import javautilList;

/

  4用socket通讯写出多个客户端和一个服务器端的通讯,

  要求客户发送数据后能够回显相同的数据(回显功能)(实用TCP方式)。

 /

public class Test4Server {

// 主入口

public static void main(String[] args) throws IOException {

scoketServer();

}

// 开启的tcp8888监听端口

public static void scoketServer() throws IOException {

ServerSocket server = new ServerSocket(8888);

while (true) {

// 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口

Socket socket = serveraccept();

Systemoutprintln(socketgetInetAddress()getHostAddress()

+ "连接进入");

new SocketThread(socket)start();

}

}

}

// 一个服务器端口中监听多个客服端通道线程

class SocketThread extends Thread {

//  所有通道写入流的集合

private static List<PrintWriter> list =new ArrayList<PrintWriter>();

private BufferedReader bufferedReader;

private PrintWriter printWriter;

public SocketThread(Socket socket) throws IOException {

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

thisprintWriter = new PrintWriter(socketgetOutputStream());

listadd(printWriter);

}

@Override

public void run() {

String string = null;

while (true) {

try {

// 服务器在通道中读到的信息回显给客服端

string = bufferedReaderreadLine();

Systemoutprintln("客服端信息:" + string);

for(PrintWriter printWriter:list ){

printWriterwrite("服务器回显:" + string + "\r\n");

printWriterflush();

}

} catch (IOException e) {

}

}

}

}

客服端代码   可以用在局域网中用多台来连接测试

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetSocket;

import javautilScanner;

public class Test4Client {

public static Object obj = new Object();

// 客服端的主入口

public static void main(String[] args) throws IOException {

socketClient();

}

// 与服务器连通地址本机(127001),局域网中其他机器是(服务器在局域网中的ip地址) 端口都是8888

public static void socketClient() throws IOException {

Socket socket = new Socket("127001", 8888);

if (socketisConnected()) {

// 如果连接成功了就开启写和读的进程

new writer(socket)start();

new read(socket)start();

} else {

Systemoutprintln("服务器未开启");

}

}

}

// 写入到通道的线程

class writer extends Thread {

@SuppressWarnings("unused")

private Socket socket;

private PrintWriter printWriter;

private Scanner scanner = new Scanner(Systemin);

private String str = null;

public writer(Socket socket) throws IOException {

thissocket = socket;

thisprintWriter = new PrintWriter(socketgetOutputStream());

}

@Override

public void run() {

scanneruseDelimiter("\r\n");

while (true) {

Systemoutprint("请输入信息:");

// 产生扫描器的线程阻塞

str = scannernext();

Systemoutprintln("我说:"+str);

printWriterwrite(str + "\r\n");

printWriterflush();

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

// 从通道中读取的线程

class read extends Thread {

private Socket socket;

private BufferedReader bufferedReader;

private String str = null;

public read(Socket socket) throws IOException {

thissocket = socket;

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

}

@Override

public void run() {

while (true) {

try {

str = bufferedReaderreadLine();

Systemoutprintln(str);

} catch (IOException e) {

}

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

SVN在服务器端的存储方式和客户端是不一样的,所以在服务器端是看不到源文件的。服务器端有两种存储方式FSFS和BDB,目前默认都是FSFS。

要导入文件有两种做法:

1、用import指令,将客户端文件夹导入到服务器端

2、先checkout空库到客户端,然后将要导入的文件夹放入客户端checkout产生的空文件夹,然后执行add将这些文件夹纳入SVN控制,最后执行commit上传到服务器

建议用后一种方法,因为前一种方法如果操作失误容易导致文件夹层次混乱

对于许多刚刚毕业的大学生来说,前端编程开发程序员的职业发展趋势还是非常不错的,而今天天通苑北大青鸟就一起来了解一下,前端编程开发技术面试中常见的html面试问题都有哪些。

1对web标准的理解是什么

先是html标签上,标签闭合,标签小写,不乱嵌套;使用语义化标签,例如header,article,少用b这样没有语义的标签,以提高搜索几率;使用外部的css文件及js文件,使结构表现行为分离;减少文件数目,达到减少网络请求次数,文件下载与页面速度更流畅;内容能被更多的用户及设备访问,保证在版本较低的浏览器下能够呈现完整内容,在版本高的浏览器上能够展现更完美的视觉效果;代码低耦合高内聚,易维护。

2HTTP状态码及其含义

100-119:接收成功,要求客户端继续提交下一次请求

200-299:接收成功且完整处理了整个过程。

300-399:客户需要进一步细化:

302:重定向

304/307:拿缓存

400-499:请求出错不能执行

404:请求资源没在web服务器中

403:没有权限,拒绝访问

500-599:服务器端错误

503:由于临时的服务器维护或者过载,服务器当前无法处理请求。

500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。

3你所知道的HTTP请求方法

GET:请求指定页面的信息,并返回实体主体。

HEAD:类似于GET请求,只不过返回的响应没有具体内容,用于获取报头

POST:向指定资源提交数据请求处理(例如表单或上传文件)。数据被包含在请求体中。POST请求可能导致新资源的建立/或已有资源的修改。

PUT:从客户端向服务器传送的数据取代指定的文档的内容。

DELETE:请求服务器删除指定的页面。

CONNECT:HTTP/11协议中预留给能够将连接改为管道方式的代理服务器。

OPTIONS:允许客户端查看服务器的性能

TRACE;回显服务器收到的请求,主要用于测试或诊断

(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)

(2)post发送的数据更大(get有url长度限制)

(3)post能发送更多的数据类型(get只能发送ASCII字符)

(4)post比get慢

(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据

(6)等等很多

以上回答,只是一些浅显的回答。

它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。

一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到“服务器”,在服务器工作完成之后,报文又会从“服务器”流到“代理”再流到“客户端”。

所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。

大致结构是这样的:

举个简单的列子:

请求行由三部分组成:请求方法,请求URL(不包括域名),HTTP协议版本。

请求方法比较多:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

最常用的是GET和POST。

传递参数长度受限制,因为传递的参数是直接表示在地址栏中,而特定浏览器和服务器对url的长度是有限制的。

因此,GET不适合用来传递私密数据,也不适合拿来传递大量数据。

一般的HTTP请求大多都是GET。

POST把传递的数据封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,对数据量没有限制,也不会显示在URL中。

表单的提交用的是POST。

HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。

删除某一个资源。

用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。

把一个资源存放在指定的位置上。

本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

回显服务器收到的请求,主要用于测试或诊断。

CONNECT方法是HTTP/11协议预留的,能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接与非加密的HTTP代理服务器的通信。

HTTP/10支持:GET、POST、HEAD三种HTTP请求方法。

HTTP/11是当前正在使用的版本。该版本默认采用持久连接,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/11新增了:OPTIONS、PUT、DELETE、TRACE、CONNECT五种HTTP请求方法。

1User-Agent : 产生请求的浏览器类型。

2Accept : 客户端希望接受的数据类型,比如 Accept:text/xml(application/json)表示希望接受到的是xml(json)类型。

3Content-Type:发送端发送的实体数据的数据类型。

比如,Content-Type:text/html(application/json)表示发送的是html类型。

4Host : 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

请求头之后是一个空行,通知服务器以下不再有请求头

GET没有请求数据,POST有。

与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length 。

状态行也由三部分组成:服务器HTTP协议版本,响应状态码,状态码的文本描述

格式:HTTP-Version Status-Code Reason-Phrase CRLF

比如:HTTP/11 200 OK

状态码:由3位数字组成,第一个数字定义了响应的类别

11xx:指示信息,表示请求已接收,继续处理。

22xx:成功,表示请求已被成功接受,处理。

33xx:重定向

44xx:客户端错误

55xx:服务器端错误,服务器未能实现合法的请求

苹果上架要求:要求支持IPV6only(因为阿里云主机没有IPV6only)

运维或后台可通过以下方式来检测服务器是否开启了ipv6通道:

方式1:使用ifconfig查看自己的IP地址是否含有IPv6地址。

方式2查看服务监听的IP中是否有IPv6格式的地址。(netstat -tuln)

开启IPV6:

vim /etc/sysctlconf

vim /etc/modprobed/disable_ipv6conf

vim /etc/sysconfig/network

至此ipv6的服务器端支持已经完成,重启服务器测试是否支持ipv6,重启后, ifconfig查看ipv6的信息,有看到有关IPV6的输出就可以

以上是阿里的ipv6

1查看服务器是否加载ipv6模块

lsmod | grep ipv6

如没有任何回显,则说明没有加载

加载ipv6模块

modprobe ipv6

再次运行lsmod | grep ipv6,如出现回显,则说明ipv6已经正常加载

2修改配置文件启用ipv6

vi /etc/modprobed/ipv6conf

修改options ipv6 disable=0

备注:如果是centos5的系统,配置文件在vi /etc/modprobeconf,注销

alias net-pf-10

alias ipv6 disable=1  这两行

vi /etc/sysconfig/network

添加NETWORKING_IPV6=yes

配置文件修改完成之后,保存退出

然后service network restart  使配置生效

3检查内核是否已经支持ipv6

sysctl -a | grep ipv6 | grep disable

运行以上命令,查看有无回显,若有回显说明内核已经支持ipv6

若没有回显,重启服务器,使内核生效

4开启内核参数支持ipv6

执行上述步骤之后,运行如下命令使内核开启ipv6

sysctl -w netipv6confalldisable_ipv6=0

再次运行sysctl -a | grep ipv6 | grep disable

若参数全部为0,则说明ipv6已经全部支持

5在网卡上配置ipv6地址

以上配置都完成之后,网卡就可以支持ipv6地址了,启用一个试试吧

备注:以上全部步骤,所有修改参数的动作均是临时修改,如果想永久生效,请修改对应的配置文件,如sysctlconf、ifcfg-eth0conf

-------------------------------------

sysctl -p

netipv4tcp_max_tw_buckets = 6000

netipv4ip_local_port_range = 1024 65000

netipv4tcp_tw_recycle = 1

netipv4tcp_tw_reuse = 1

netipv4tcp_syncookies = 1

netcoresomaxconn = 262144

netcorenetdev_max_backlog = 262144

netipv4tcp_max_orphans = 262144

netipv4tcp_max_syn_backlog = 262144

netipv4tcp_synack_retries = 1

netipv4tcp_syn_retries = 1

netipv4tcp_fin_timeout = 1

netipv4tcp_keepalive_time = 30

netipv4tcp_window_scaling = 1

netipv6confalldisable_ipv6 = 0

sysctl -a | grep ipv6 | grep disable

netipv6confalldisable_ipv6 = 0

netipv6confdefaultdisable_ipv6 = 0

netipv6conflodisable_ipv6 = 0

netipv6confeth0disable_ipv6 = 0

FlashFXP v336 build 1125 [BETA RELEASE] Support Forums at http://foruminicomnet WinSock 20 -- OpenSSL 098a 11 Oct 2005 [R] 正在连接到 wwwacn -> DNS=wwwacn IP=1214111581 PORT=21 [R] 已连接到 wwwacn [R] 220 Serv-U FTP Server v62 for WinSock ready(这一行返回的是FTP服务器的版本信息)

HTTP请求的方法:

HTTP/11协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式

1、OPTIONS

返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘’的请求来测试服务器的功能性

2、HEAD

向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。

3、GET

向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url

4、POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form

5、PUT

向指定资源位置上传其最新内容

6、DELETE

请求服务器删除Request-URL所标识的资源

7、TRACE

回显服务器收到的请求,主要用于测试或诊断

8、CONNECT

HTTP/11协议中预留给能够将连接改为管道方式的代理服务器。

注意:

1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。

2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情