------- android培训、java培训、期待与您交流! ----------
为了可以让多个客户端同时并发访问服务端,那么服务端最好就是讲每个客户端
封装到一个单独的线程中,这样就可以同时处理多个客户端请求。
定义线程,只要明确了每个客户端要在服务端执行的代码即可,并将该代码存入run方法中。
客户端并发登陆练习
需求:
客户端通过键盘录入用户名,服务端对这个用户名进行校验。
如果用户名存在,在服务端显示xxx,已登录,并在客户端显示xxx,欢迎光临。
如果该用户不存在,在服务端显示xxx,尝试登陆,并在客户端显示xxx,该用户不存在。
最多登陆三次。
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
Socket s=new Socket("192.168.0.103",10004);
BufferedReader bur=
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);//将读到的数据发送出去
BufferedReader burIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
for(int x=0;x<3;x++)
{
String line=bur.readLine();
if(line==null)
break;
out.println(line);
String info=burIn.readLine();
System.out.println("info"+info);
if(info.contains("欢迎"))
break;
}
bur.close();
s.close();//关闭客户端
}
}
class UserThread implements Runnable
{
private Socket s;
UserThread(Socket s)
{
this.s=s;
}
public void run()
{
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"::connected");
try
{
for(int x=0;x<3;x++)
{
BufferedReader burIn=
new BufferedReader(new InputStreamReader(s.getInputStream()));
String name =burIn.readLine();
if(name==null)
break;
BufferedReader bur=new BufferedReader(new FileReader("user.txt"));
PrintWriter out=new PrintWriter(s.getOutputStream());
String line=null;
boolean flag=false;//定义判断标识
while((line=bur.readLine())!=null);
{
if(line.equals(name))
{
flag=true;
break;
}
}
if(flag)
{
System.out.println(name+"已登录");
out.println(name+"欢迎光临");
}
else
{
System.out.println(name+"尝试登陆");
out.println(name+"用户名不存在");
}
}
s.close();
}
catch(Exception e)
{
throw new RuntimeException(ip+"校验失败");
}
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10004);
while(true)
{
Socket s=ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或者目录,也可以是对更为复杂的对象的引用,
例如对数据库或搜索引擎的查询。
演示:
import java.net.*;
class UrlTest
{
public static void main(String[] args)
{
URL url=new URL("http://192.168.1.104:8080/myweb/test.html");
System.out.println("getProtocol():"+url.getProtocol());//获取此URL的协议名称
System.out.println("getHost():"+url.getHost());//获取此URL的主机名(如果适用)
System.out.println("getPort():"+url.getPort());//获取此URL的端口号
System.out.println("getPath():"+url.getPath());//获取此URL的路径部分
System.out.println("getFile():"+urlgetFile().);//获取此URL的文件名
System.out.println("getQuery():"+url.getQuery());//获取此URL的查询部
}
}
/*
注:一般输入网址,是不带端口号的,此时可进行获取,通过获取网址返回的port,若port为-1,则分配一个默认的80端口,如
int port = getPort();
if(port == -1)
port = 80;
*/
URLConnection
方法:
1,URLConnection openConnection();//用URL调用此方法,返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接
2,InputStream getInputStream();//获取输入流
3,OutputStream getOutputStream();//获取输出流
域名解析