JAVA基础学习day25--Socket基础二-多线程
一、上传图片
1.1、示例
/*
上传图片
*/
import java.net.*;
import java.io.*;
import java.util.*;
import java.text.*;
/*
客户端
1.建立客户端服务
2.读取客户端已经有数据,,将文件名发送给服务端
3.通过Scoket,输出流将数据发送给服务端
4.接收服务端返回信息
5.关流Socket和流资源
*/
class UploadClient1
{
public static void main(String[] args) throws Exception
{
//建立片客户端服务
Socket s=new Socket("localhost",10009);
//客户端资源
File file=new File("d:\\1.jpg");
//获取文件名
String filename=file.getName();
//获取打印流,并将文件名发送到服务端,true表示自动刷新
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println(filename);
//字节缓冲流读取文件
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));
//字节缓冲输出流
BufferedOutputStream bosOut=new BufferedOutputStream(s.getOutputStream()); int len=0;
while((len=bis.read())!=-1)
{
bosOut.write(len);
bosOut.flush();
}
//增加结束标记
s.shutdownOutput();
//字节缓冲输入流,用于接收服务端发回的数据
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String rep=br.readLine();
System.out.println(rep);
bis.close();
s.close();
}
}
/*
服务端
1.建立服务端服务,并指定端口
2.接收客户端发送的文件名,读取客户端发送的数据
3.通过Scoket,输出流将数据写在服务端文件
4.发送返回信息
5.关流Socket和流资源
*/
class UploadServer1
{
public static void main(String[] args) throws Exception
{
//建立服务端服务,指定端口
ServerSocket ss=new ServerSocket(10009); //建立客户端Socket对象
Socket s=ss.accept();
//字节缓冲输入流,用于接收服务端发回的数据
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); String filename=br.readLine();
System.out.println(filename);
//文件读取流
BufferedInputStream bisIn=new BufferedInputStream(s.getInputStream()); //建立服务端文件
File file=new File("f:\\",filename);
if(file.exists())
{
//如果文件存在就重命名
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HHmmss");
Date date=new Date();
String time=sdf.format(date);
//只获取文件名的部分
String name=filename.substring(0,filename.indexOf("."));
String prefix=name+time;
//扩展名
String suffix=filename.substring(filename.indexOf("."));
filename=prefix+suffix;
//重新指定文件
file=new File("f:\\",filename); }
FileOutputStream fos=new FileOutputStream(file);
byte[] bufw=new byte[1024];
int len=0;
while((len=bisIn.read(bufw))!=-1)
{
fos.write(bufw,0,len);
}
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功");
fos.close();
s.close();
ss.close();
}
}
二、客户端并发,使用多线程
2.1、示例
客户端:
package com.pb.demo2; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; /*
客户端
*/
class FileUploadClient
{
public static void main(String[] args) throws Exception
{
//建立片客户 端服务
Socket s=new Socket("localhost",10010);
//获取文件
File file=new File("d:\\gm.mp3");
//获取流把文件名发送出去
String filename=file.getName();
System.out.println(filename);
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//发送文件名
pw.println(filename);
//输出流
OutputStream os=s.getOutputStream();
//文件读取流
FileInputStream fis=new FileInputStream(file);
int len=0;
byte [] buf=new byte[1024];
//开始读取,并把文件通过网络流socket发送到服务端
while((len=fis.read(buf))!=-1)
{
os.write(buf,0,len);
}
//发送发闭,发送结束标记
s.shutdownOutput();
//接收服务器返回的信息
InputStream is=s.getInputStream(); byte [] bfw=new byte[1024];
int repLen=is.read(bfw);
String rep=new String(bfw,0,repLen);
System.out.println(rep);
fis.close();
s.close();
}
}
服务端
package com.pb.demo2; import java.net.ServerSocket;
import java.net.Socket; /*
服务端
*/
class FileUploadServer
{
public static void main(String[] args) throws Exception
{
//建立服务端服务
ServerSocket ss=new ServerSocket(10010);
//建立循环监听,一直运行
while(true)
{
Socket s=ss.accept();
//每个客户端 都一个单独的线程
new Thread(new FileServerThread(s)).start();
} }
}
线程
package com.pb.demo2; import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket; /*
服务端线程类
*/
class FileServerThread implements Runnable
{
//Socket做为参数
private Socket s;
public FileServerThread(Socket s)
{
this.s=s;
}
//多线程方法
public void run()
{
//定一个计数器用来给文件重命名
int count=1;
//获取IP
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+".................connected");
try
{ //读取流
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//读取文件名
String filename=br.readLine();
System.out.println(filename);
File file=new File("f:\\",filename);
//判断文件是否存在
while(file.exists())
{
//截取文件名前缀与后缀
String prefix=null;
String suffix=null;
String name=filename.substring(0,filename.indexOf("."));
//判断文件名是否有(
if(name.contains("("))
{
prefix=filename.substring(0,filename.indexOf("("));
}else{
prefix=name;
}
prefix=prefix+"("+(count++)+")";
suffix=filename.substring(filename.lastIndexOf("."));
//文件名重命名
filename=prefix+suffix;
file=new File("f:\\",filename);
System.out.println(filename);
}
//读取文件
InputStream isr=s.getInputStream();
//输出流
FileOutputStream fos=new FileOutputStream(file);
int len=0;
byte [] bufw = new byte[1024];
while((len=isr.read(bufw))!=-1)
{
fos.write(bufw,0,len);
}
//发送信息到客户端
OutputStream os=s.getOutputStream();
os.write("上传成功".getBytes()); fos.close();
s.close();
}
catch (Exception e)
{
throw new RuntimeException("上传失败!");
} } }
三、客户端 登录
3.1、示例
/*
客户端 键盘输入用户名
服务端对这个用户名进行校验
如果该用户名存在,在服务端显示XXX,已经登录
并在客户端显示XXX,欢迎光临
如果该用户不存在,在服务端显示XXX,尝试登录
并在客户显示XXX,该用户不存在 最多登录三次
*/
/*
客户端
*/
import java.net.*;
import java.io.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
//建立客户端服务
Socket s=new Socket("localhost",10010);
//接收键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//打印流,向服务端发送信息
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//接收服务端返回的信息
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream())); for(int x=0;x<3;x++)
{ //接收键盘输入
String line=br.readLine();
if(line==null)
break;
pw.println(line);
//返回信息
String info=brIn.readLine();
System.out.println(info);
//比较是否登录成功
if(info.contains("欢迎"))
break;
}
br.close();
s.close();
}
}
/*
服务端
*/
class LoginServer
{
public static void main(String[] args) throws Exception
{
//建立服务端服务
ServerSocket ss=new ServerSocket(10010);
while(true)
{
//建立监听
Socket s=ss.accept();
new Thread(new LoginThread(s)).start();
}
}
}
/*
服务端登录线程
*/
class LoginThread implements Runnable
{
private Socket s;
public LoginThread(Socket s)
{
this.s=s;
}
public void run()
{ //IP
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected");
try
{
BufferedReader brIn=null;
BufferedReader br=null;
PrintWriter pw=null;
//只校验3次
for(int x=0;x<3;x++)
{ //读取客户端信息
brIn=new BufferedReader(new InputStreamReader(s.getInputStream())); //用户名
String username=brIn.readLine();
if(username==null)
break;
//读取文件判断
br=new BufferedReader(new InputStreamReader(new FileInputStream("f:\\user.txt")));
//向客户端发送信息
pw=new PrintWriter(s.getOutputStream(),true);
//文件内容
String line=null;
boolean flag=false;
while((line=br.readLine())!=null)
{
if(line.equals(username))
{ //找到,结束,标记为true
flag=true;
break;
} }
//判断
if(flag)
{
System.out.println(username+"已经登录!");
pw.println(username+",欢迎光临!");
}
else
{
System.out.println(username+"尝试登录!");
pw.println(username+",该用户不存在!");
}
}
//关闭
br.close();
s.close();
}
catch (Exception e)
{
throw new RuntimeException("登录失败");
}
}
}
/*
user.txt
zhangsan
lisi
wangwu
qianqi
*/
四、浏览器客户端-自定义服务端
4.1、示例
/*
建立服务端,自定义服务端
通过浏览器,访问服务端
*/
import java.net.*;
import java.io.*;
class ServerDemo
{
public static void main(String[] args) throws Exception
{ //建立服务端
ServerSocket ss=new ServerSocket(11000);
//获取
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"........connected");
//向浏览器客户端发送数据
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("<font color='red' size='10'>"+ip+"客户</font>");
s.close();
ss.close(); }
}
五、浏览器客户端-Tomcat服务端)
5.1、示例
六、自定义浏览器-tomcat
6.1、示例
package com.pb.tcp; import java.net.*;
import java.io.*;
class MyIE
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("localhost",8080);
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("GET /examples/index.jsp HTTP/1.1");
out.println("Accept: text/html, application/xhtml+xml, */*");
out.println("Accept-Language: zh-CN");
out.println("Host: localhost:11000");
out.println("Connection: Keep-Alive"); out.println();
out.println();
System.out.println("==============");
InputStream is=s.getInputStream();
byte[] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
s.close();
}
}
/*
Http:请求头消息头
GET / HTTP/1.1 浏览向服务器发送一个get请求,使用的是http:1.1协议
Accept: text/html, application/xhtml+xml, 支持的数据类型,可以有更多
Accept-Language: zh-CN ,浏览器支持的语言是简体中文
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.
0) 用户信息
Accept-Encoding: gzip, deflate 支持的编码,压缩格式,
Host: 127.0.0.1:11000 访问的主机地址和端口
Connection: Keep-Alive 连接,保持连接 */
==============
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1030
Date: Sun, 18 Oct 2015 13:47:51 GMT <!DOCTYPE html><html><head><title>Apache Tomcat/8.0.26 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 404 - /examples/index.jsp</h1><div class="line"></div><p><b>type</b> Status report</p><p><b>message</b> <u>/examples/index.jsp</u></p><p><b>description</b> <u>The requested resource is not available.</u></p><hr class="line"><h3>Apache Tomcat/8.0.26</h3></body><
/html>
示例:图形化界面
package com.pb.demo2;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.net.*;
import java.io.*;
//http://localhost:8080/myweb/my.html
public class MyFrame { private Frame f;
private Button b;
private TextField tf;
private TextArea ta; public MyFrame(){
init();
}
public void init(){
f=new Frame("我的窗体");
f.setBounds(300, 100, 600, 500);
f.setLayout(new FlowLayout());
tf=new TextField(50);
b=new Button("GO");
ta=new TextArea(20,50);
f.add(tf);
f.add(b);
f.add(ta);
myEvent();
f.setVisible(true); }
public void myEvent(){ //按键添加监听器,事件输入完成,点按键执行
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//调用显示
show();
}
}
);
//文本框添加事件监听,输入完成,敲回车执行
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
//调用
show();
}
}
}
);
}
private void show(){
//获取文本框中输入的内容
String url=tf.getText();
//获取包含//的下标+2
int index1=url.indexOf("//")+2;
//获取/的下标
int index2=url.indexOf("/",index1);
//获取//----/之间的内容
String str=url.substring(index1, index2);
//按:分割192.168.1.254:8080
String [] arr=str.split(":");
String host=arr[0];
int port=Integer.parseInt(arr[1]);
//获取/后面的路径
String path=url.substring(index2);
//添加到文本域中
ta.append(host+"..."+port+"..."+path);
try {
showWeb(host,port,path);
} catch (Exception e) {
e.printStackTrace();
} }
private void showWeb(String host,int port,String path) throws Exception{
//浏览器
Socket s=new Socket(host,port);
//打印流,true,自动刷新
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("GET "+path+" HTTP/1.1");
out.println("Accept: */*");
out.println("Accept-Language: zh-CN");
out.println("Host: 127.0.0.1:11000");
out.println("Connection: Keep-Alive");
out.println();
out.println();
InputStream is=s.getInputStream();
byte [] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
ta.append(new String(buf,0,len));
}
s.close(); } public static void main(String[] args) {
new MyFrame(); } }
/*
Http:请求头消息头
GET / HTTP/1.1 浏览向服务器发送一个get请求,使用的是http:1.1协议
Accept: text/html, application/xhtml+xml, 支持的数据类型,可以有更多
Accept-Language: zh-CN ,浏览器支持的语言是简体中文
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.
0) 用户信息
Accept-Encoding: gzip, deflate 支持的编码,压缩格式,
Host: 127.0.0.1:11000 访问的主机地址和端口
Connection: Keep-Alive 连接,保持连接 */
七、URL数据方法获取
7.1、方法
类 URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。有关 URL 的类型和格式的更多信息,可从以下位置找到:
通常,URL 可分成几个部分。上面的 URL 示例指示使用的协议为 http
(超文本传输协议)并且该信息驻留在一台名为 www.socs.uts.edu.au
的主机上。主机上的信息名称为 /MosaicDocs-old/url-primer.html
。主机上此名称的准确含义取决于协议和主机。该信息一般存储在文件中,但可以随时生成。该 URL 的这一部分称为路径 部分。
URL 可选择指定一个“端口”,它是用于建立到远程主机 TCP 连接的端口号。如果未指定该端口号,则使用协议默认的端口。例如,http
协议的默认端口为 80
。还可以指定一个备用端口,
构造方法摘要 | |
---|---|
URL(String spec) 根据 String 表示形式创建 URL 对象。 |
|
URL(String protocol, String host, 根据指定 protocol 、host 、port 号和 file 创建 URL 对象。 |
|
URL(String protocol, String host, 根据指定的 protocol 、host 、port 号、 file 和 handler 创建 URL 对象。 |
|
URL(String protocol, String host, String file) 根据指定的 protocol 名称、host 名称和file 名称创建 URL。 |
|
URL(URL context, String spec) 通过在指定的上下文中对给定的 spec 进行解析创建 URL。 |
|
URL(URL context, String spec, URLStreamHandler handler) 通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。 |
方法摘要 | |
---|---|
boolean |
equals(Object obj) 比较此 URL 是否等于另一个对象。 |
String |
getAuthority() 获取此 URL 的授权部分。 |
Object |
getContent() 获取此 URL 的内容。 |
Object |
getContent(Class[] classes) 获取此 URL 的内容。 |
int |
getDefaultPort() 获取与此 URL 关联协议的默认端口号。 |
String |
getFile() 获取此 URL 的文件名。 |
String |
getHost() 获取此 URL 的主机名(如果适用)。 |
String |
getPath() 获取此 URL 的路径部分。 |
int |
getPort() 获取此 URL 的端口号。 |
String |
getProtocol() 获取此 URL 的协议名称。 |
String |
getQuery() 获取此 URL 的查询部分。 |
String |
getRef() 获取此 URL 的锚点(也称为“引用”)。 |
String |
getUserInfo() 获取此 URL 的 userInfo 部分。 |
int |
hashCode() 创建一个适合哈希表索引的整数。 |
URLConnection |
openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。 |
URLConnection |
openConnection(Proxy proxy) 与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。 |
InputStream |
openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的InputStream 。 |
boolean |
sameFile(URL other) 比较两个 URL,不包括片段部分。 |
protected |
set(String protocol, String host, 设置 URL 的字段。 |
protected |
set(String protocol, String host, 设置 URL 的指定的 8 个字段。 |
static void |
setURLStreamHandlerFactory(URLStreamHandlerFactory fac) 设置应用程序的 URLStreamHandlerFactory 。 |
String |
toExternalForm() 构造此 URL 的字符串表示形式。 |
String |
toString() 构造此 URL 的字符串表示形式。 |
URI |
toURI() 返回与此 URL 等效的 URI 。 |
7.2、示例
URL url=new URL("http://127.0.0.1/myweb/demo.html?name=wangwu&age=89"); System.out.println("Protocol:"+url.getProtocol()); System.out.println("Host:"+url.getHost()); System.out.println("Port :"+url.getPort()); System.out.println("Path :"+url.getPath()); System.out.println("File :"+url.getFile()); System.out.println("Query :"+url.getQuery());
/*
String getAuthority()
获取此 URL 的授权部分。
Object getContent()
获取此 URL 的内容。
Object getContent(Class[] classes)
获取此 URL 的内容。
int getDefaultPort()
获取与此 URL 关联协议的默认端口号。
String getFile()
获取此 URL 的文件名。
String getHost()
获取此 URL 的主机名(如果适用)。
String getPath()
获取此 URL 的路径部分。
int getPort()
获取此 URL 的端口号。
String getProtocol()
获取此 URL 的协议名称。
String getQuery()
获取此 URL 的查询部分。
String getRef()
获取此 URL 的锚点(也称为“引用”)。
String getUserInfo()
获取此 URL 的 userInfo 部分。 */
URL url=new URL("http://127.0.0.1:8080/myweb/my.html?name=java&age=30");
System.out.println("getAuthority:"+url.getAuthority());
System.out.println("getContent:"+url.getContent());
System.out.println("getDefaultPort:"+url.getDefaultPort());
System.out.println("getFile:"+url.getFile());
System.out.println("getHost:"+url.getHost());
System.out.println("getPath:"+url.getPath());
System.out.println("getPort:"+url.getPort());
System.out.println("getProtocol:"+url.getProtocol());
System.out.println("getQuery:"+url.getQuery());
System.out.println("getRef:"+url.getRef());
System.out.println("getUserInfo:"+url.getUserInfo());
getAuthority:127.0.0.1:8080
getContent:sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@70dea4e
getDefaultPort:80
getFile:/myweb/my.html?name=java&age=30
getHost:127.0.0.1
getPath:/myweb/my.html
getPort:8080
getProtocol:http
getQuery:name=java&age=30
getRef:null
getUserInfo:null
示例2、URLConnection没有头文件
package com.pb.demo2; import java.io.*;
import java.net.*;
/*
* URLConnection 封装了Socket
*/
public class URLConnectionDemo {
//127.0.0.1:8080/myweb/my.html?name=java&age=30
public static void main(String[] args) throws IOException {
URL url=new URL("http://127.0.0.1:8080/myweb/my.html?name=java&age=30");
//返回一个URL远程连接对象
URLConnection conn=url.openConnection();
//输出连接对象
System.out.println(conn);
InputStream is=conn.getInputStream();
int len=0;
byte[] buf=new byte[1024];
while((len=is.read(buf))!=-1){
System.out.println(new String(buf,0,len));
} } }
sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/my.html?name=java&age=30
<html>
<head>
<title>我的页面</title>
</head>
<body>
<h1>这是个标题</h1>
</body>
</html>
示例3:改变第六中的示例
package com.pb.demo2; import java.awt.Button; import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*; //http://localhost:8080/myweb/my.html
public class MyFrame2 { private Frame f;
private Button b;
private TextField tf;
private TextArea ta; public MyFrame2(){
init();
}
public void init(){
f=new Frame("我的窗体");
f.setBounds(300, 100, 600, 500);
f.setLayout(new FlowLayout());
tf=new TextField(30);
b=new Button("GO");
ta=new TextArea(20,50); f.add(tf);
f.add(b);
f.add(ta); f.setVisible(true);
myEvent(); }
public void myEvent(){
//窗体监听器,
f.addWindowListener(new WindowAdapter(){
//关闭事件
public void windowClosing(WindowEvent e)
{
System.out.println("fsdfdsfds");
System.exit(0);
}
}); //按键添加监听器,事件输入完成,点按键执行
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//调用显示
try {
show();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
);
//文本框添加事件监听,输入完成,敲回车执行
tf.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
//调用
try {
show();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
);
}
public void show() throws UnknownHostException, IOException{
ta.setText("");
//获取文本框中输入的内容
String urlPath=tf.getText(); URL url=new URL(urlPath);
//和目标url建立连接
URLConnection conn=url.openConnection();
//添加到文本域中 //浏览器接收信息封装了Socket可以使用Socket中的流对象
InputStream is=conn.getInputStream();
byte [] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
ta.setText(new String(buf,0,len));
}
}
public static void main(String[] args) {
new MyFrame2(); } }
/*
Http:请求头消息头
GET / HTTP/1.1 浏览向服务器发送一个get请求,使用的是http:1.1协议
Accept: text/html, application/xhtml+xml, 支持的数据类型,可以有更多
Accept-Language: zh-CN ,浏览器支持的语言是简体中文
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.
0) 用户信息
Accept-Encoding: gzip, deflate 支持的编码,压缩格式,
Host: 127.0.0.1:11000 访问的主机地址和端口
Connection: Keep-Alive 连接,保持连接 */
八、域名解析
8.1、概述
127.0.0.1与localhost映射关系在本机
域名与IP可以在hosts中配置映射
C:\Windows\System32\drivers\etc\hosts文件中配置
JAVA基础学习day25--Socket基础二-多线程的更多相关文章
- Java RMI学习与解读(二)
Java RMI学习与解读(二) 写在前面 接上篇文章,这篇主要是跟着看下整个RMI过程中的源码并对其做简单的分析 RMI源码分析 还是先回顾下RMI流程: 创建远程对象接口(RemoteInterf ...
- Java最新学习线路(基础,源码,项目,实战)
如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- Python学习 :socket基础
socket基础 什么是socket? - socket为接口通道,内部封装了IP地址.端口.协议等信息:我们可以看作是以前的通过电话机拨号上网的年代,socket即为电话线 socket通信流程 我 ...
- Java WebService学习笔记 - Axis进阶(二)
上一篇 Java WebService学习笔记 - Axis(一) 前一篇博文中简单介绍了Axis的使用方法,这篇将介绍一些Axis的一些高级特性 Axis中Handler的使用 Handler ...
- java基础学习总结——GUI编程(二)
一.事件监听
- JAVA多线程基础学习一:基础知识
我们知道多线程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 一.线程基本概念 1 线程:进程中负责程序执行的执行单元(执行 ...
- java基础学习总结——GUI编程(二) 未学习
一.事件监听
- JAVA基础学习之路(二)方法定义,重载,递归
一,方法的定义: package test; public class test1 { public static void main(String args[]) { int result = ad ...
随机推荐
- MyEclipse for Spring启动时报错"An internal error occurred during: 'Updating indexes'.Java heap space"的解决办法
问题 MyEclipse for Spring在启动时,报如下错误:An internal error occurred during: 'Updating indexes'.Java heap sp ...
- 原生js提交表单
/********************* 表单提交 ***********************/ function ajax(options) { options = options || { ...
- mysql 语句case when
CREATE TABLE `lee` (`id` int(10) NOT NULL AUTO_INCREMENT, `name` char(20) DEFAULT NULL, `birthday` d ...
- 2014 网选 5012 Dice(bfs模板)
/* 题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同! 问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同! 思路:很直白的bfs,将每一种 ...
- DalekJS – 基于 JavaScript 实现跨浏览器的自动化测试
在 Web 项目中,浏览器兼容以及跨浏览器测试是最重要的也是最费劲的工作.DalekJS 是一个基于 JavaScript(或 Node.js) 的免费和开源的自动化测试接口.它能够同时运行测试一组流 ...
- 学习android开发笔记
最近重点看了几个android工程的源代码,有几点疑问 1:为什么android客户端游戏要开启n个线程,而且通常每个线程的操作只有i++: 2:为什么很多列表在游戏逻辑和绘制逻辑里没有做同步: 3: ...
- Django--models连表构建
需求 models多表(一对多.多对多.一对一)的构建 速查 1.一对多 1 2 3 class User(models.Model): name = models.CharField(max ...
- ActiveMQ学习(三)——MQ的通讯模式
1) 点对点通讯:点对点方式是最为传统和常见的通讯方式,它支持一对一.一对多.多对多.多对一等多种配置方式,支持树状.网状等多种拓扑结构. 2) 多点广播:MQ适用于不同类型的应用.其中重要的,也是正 ...
- [Solution] DI原理解析及Castle、Unity框架使用
本节目录 DI介绍 DI基本原理 DI框架 Castle Windsor Unity Autofac Spring.Net DI介绍 控制反转(Inversion of Control,英文缩写为Io ...
- [Code] C#与js的正则表达式
元字符: 单个字符: . [] 限定符: * + ? {n} {n,} {n,m} 头尾: ^ $' 其他: | () 正则表达式在js和C#中都有. C#中: 创建: var regex = new ...