需求:上传图片。
客户端。
1,服务端点。
2,读取客户端已有的图片数据。
3,通过socket 输出流将数据发给服务端。
4,读取服务端反馈信息。
5,关闭。
服务端
这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
这时B客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
暂时获取不到B客户端对象。
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
如何定义线程呢?
只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
最多就登录三次。
演示客户端和服务端。
1, 客户端:浏览器 (telnet)
服务端:自定义。
2, 客户端:浏览器。
服务端:Tomcat服务器。
3, 客户端:自定义。(图形界面)
服务端:Tomcat服务器。
请求的信息:
http://192.168.1.254:11000/myweb/demo.html //请求的地址
GET /myweb/demo.html HTTP/1.1 请求的路径,协议
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, i //支持的数据类型
mage/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application
/msword, application/QVOD, application/QVOD, ×/×
Accept-Language: zh-cn //支持的语言
Accept-Encoding: gzip, deflate //支持的编码
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0 //用户代理
.50727)
Host: 192.168.1.254:11000 //请求的主机名和端口号
Connection: Keep-Alive //连接:保持连接
反馈的信息:
HTTP/1.1 200 OK //支持的协议,,,OK的
Server: Apache-Coyote/1.1 //服务器:阿帕奇
Accept-Ranges: bytes //接收的类型:字节
ETag: W/"109-1368068023721" //标识
Last-Modified: Thu, 09 May 2013 02:53:43 GMT //文件最后的修改时间
Content-Type: text/html //文件类型 html
Content-Length: 109 //文件大小
Date: Thu, 09 May 2013 02:57:55 GMT //日期
Connection: close //连接:关闭连接
URL:
String getFile()
获取此 URL 的文件名。 //文件名包含文件路径部分和查询部分
String getHost()
获取此 URL 的主机名(如果适用)。
String getPath()
获取此 URL 的路径部分。
int getPort()
获取此 URL 的端口号。
String getProtocol()
获取此 URL 的协议名称。
String getQuery()
获取此 URL 的查询部分。
URLConnection openConnection()
返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnection:
InputStream getInputStream()
返回从此打开的连接读取的输入流。
OutputStream getOutputStream()
返回写入到此连接的输出流。
其实URLConnection内部封装了Socket流,将网际层提升到了应用层,URL是对URL地址的描述的一个类,因为URL地址是一个复杂的事物。
InetSocketAddress:封装的是IP地址+端口,,,还有ServerSocket构造函数中接收的可以有个队列长度需要了解一下。
域名解析:
先找HOSTS文件,HOSTS文件中没有才去DNS服务器上面去找域名对应的IP,然后再拿IP直接访问对应的主机和端口
客户端。
1,服务端点。
2,读取客户端已有的图片数据。
3,通过socket 输出流将数据发给服务端。
4,读取服务端反馈信息。
5,关闭。
服务端
这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
这时B客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
暂时获取不到B客户端对象。
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
如何定义线程呢?
只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。
客户端通过键盘录入用户名。
服务端对这个用户名进行校验。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
最多就登录三次。
演示客户端和服务端。
1, 客户端:浏览器 (telnet)
服务端:自定义。
2, 客户端:浏览器。
服务端:Tomcat服务器。
3, 客户端:自定义。(图形界面)
服务端:Tomcat服务器。
请求的信息:
http://192.168.1.254:11000/myweb/demo.html //请求的地址
GET /myweb/demo.html HTTP/1.1 请求的路径,协议
Accept: application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, i //支持的数据类型
mage/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application
/msword, application/QVOD, application/QVOD, ×/×
Accept-Language: zh-cn //支持的语言
Accept-Encoding: gzip, deflate //支持的编码
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0 //用户代理
.50727)
Host: 192.168.1.254:11000 //请求的主机名和端口号
Connection: Keep-Alive //连接:保持连接
反馈的信息:
HTTP/1.1 200 OK //支持的协议,,,OK的
Server: Apache-Coyote/1.1 //服务器:阿帕奇
Accept-Ranges: bytes //接收的类型:字节
ETag: W/"109-1368068023721" //标识
Last-Modified: Thu, 09 May 2013 02:53:43 GMT //文件最后的修改时间
Content-Type: text/html //文件类型 html
Content-Length: 109 //文件大小
Date: Thu, 09 May 2013 02:57:55 GMT //日期
Connection: close //连接:关闭连接
URL:
String getFile()
获取此 URL 的文件名。 //文件名包含文件路径部分和查询部分
String getHost()
获取此 URL 的主机名(如果适用)。
String getPath()
获取此 URL 的路径部分。
int getPort()
获取此 URL 的端口号。
String getProtocol()
获取此 URL 的协议名称。
String getQuery()
获取此 URL 的查询部分。
URLConnection openConnection()
返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnection:
InputStream getInputStream()
返回从此打开的连接读取的输入流。
OutputStream getOutputStream()
返回写入到此连接的输出流。
其实URLConnection内部封装了Socket流,将网际层提升到了应用层,URL是对URL地址的描述的一个类,因为URL地址是一个复杂的事物。
InetSocketAddress:封装的是IP地址+端口,,,还有ServerSocket构造函数中接收的可以有个队列长度需要了解一下。
域名解析:
先找HOSTS文件,HOSTS文件中没有才去DNS服务器上面去找域名对应的IP,然后再拿IP直接访问对应的主机和端口