---------------------- android培训、java培训、期待与您交流! ----------------------
那么为了可以让多个客户端同时并发访问服务端,服务端可以将客户端封装到一个单独的线程中,
这样就可以同时处理多个客户请求。
如何定义线程呢?
只要明确每一个客户端要在服务端执行的代码即可,将该代码存入run方法中。
/*
上传图片2
从主函数中传入参数,然后上传到服务端。上传之前要进行判断是否附和上传的标准。
在命令行输入图片的绝对路径
*/
/*客户端
1服务端点
2读取客户端已有图片数据
3通过Socket输出流发给服务端
4读取服务端反馈信息
*/
import java.io.*;
import java.net.*;
class PicClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",10005);
if(args.length!=1) {
System.out.println("请上传图片");
return;
}
File file = new File(args[0]);
if(!(file.exists() && file.isFile())) {
System.out.println("该文件不存在,或者不是文件");
return;
}
if(!((file.getName().endsWith(".bmp"))||(file.getName().endsWith(".jpg")))) {//只能上传bmp和jpg格式的图片
System.out.println("文件格式不正确");
return;
}
if(file.length()>1024*1024*5) {
System.out.println("文件过大,请上传小于5MB的文件");
return;
}
FileInputStream fis = new FileInputStream(file);
OutputStream os = s.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
os.write(buf,0,len);
}
s.shutdownOutput();
InputStream in = s.getInputStream();//接受客户端的反馈信息
byte[] bufIn = new byte[1024];
int num = in.read(bufIn);
System.out.println(new String(bufIn,0,num));
fis.close();
s.close();
}
}
服务端*/
/*
这个服务端有个局限。当A客户连接后,服务端执行具体流程,这时B客户端连接,只有等待。
因为服务端还没有处理完A客户的请求,还有循环回来执行下次accept方法,
所以暂时获取不到B客户端对象。
那么为了可以让多个客户端同时并发访问服务端,服务端可以将客户端封装到一个单独的线程中,
这样就可以同时处理多个客户请求。
如何定义线程呢?
只要明确每一个客户端要在服务端执行的代码即可,将该代码存入run方法中。
class PicThread implements Runnable
{
private Socket s;
PicThread(Socket s) {
this.s = s;
}
public void run() {
try
{
int count = 1;
String ip = s.getInetAddress().getHostAddress();
System.out.println("IP:"+ip);
InputStream is = s.getInputStream();
File file = new File(ip+".jpg");
while(file.exists()) {
file = new File(ip+"("+(count++)+")"+".jpg");
}
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len = 0;
while((len=is.read(buf))!=-1)
fos.write(buf,0,len);
OutputStream os = s.getOutputStream();
Thread.sleep(1000);
os.write("上床成功 received".getBytes());
s.close();
fos.close();
}
catch (Exception e)
{
throw new RuntimeException("上传失败!");
}
}
}
class PicServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10005);
while(true) {
Socket s = ss.accept();
new Thread(new PicThread(s)).start();
}
}
}
客户端并发登录
客户端通过键盘输入用户名
服务端对用户名进行校验
如果该用户存在,在服务端显示XXX已登录。
并在客户端显示XXX欢迎光临。
如果该用户不存在,在服务端显示XXX尝试登录
并在客户端显示XXX,该用户不存在。
最多登录三次
import java.io.*;
import java.net.*;
class LoginClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("127.0.0.1",5000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//获取取键盘输入
PrintWriter out = new PrintWriter(s.getOutputStream(),true);//将客户信息写入服务端
BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));//获取服务端的反馈
for(int i=0;i<3;i++) {
String line = br.readLine();//读取输入
if(line==null)
break;
out.println(line);
String info = brIn.readLine();
System.out.println("info::"+info);
if(info.contains("欢迎"))
break;
}
br.close();
s.close();
}
}
//对客户端请求封装为线程
class UserThread implements Runnable
{
private Socket s;
UserThread(Socket s){
this.s = s;
}
public void run() {
for(int i=0;i<3;i++) {
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connected");
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedReader bufr = new BufferedReader(new FileReader("F:\\MyProject\\src\\user.txt"));//文件中存放用户名列表
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String name = br.readLine();
if(name==null)//假如服务端输入空则跳出for循环,没有词判断会执行两次null操作
break;
String line = null;
boolean flag = false;
while((line=bufr.readLine())!=null) {
if(line.equals(name)){
flag = true;
break;
}
}
if(flag) {
System.out.println(name+"已登录");
out.println(name+"欢迎登录");
break;
}
else {
System.out.println(name+"尝试登录");
out.println(name+"用户不存在");
}
}
catch (Exception e)
{
throw new RuntimeException("登录失败");
}
}
}
}
class LoginServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(5000);
while(true) {
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}
演示客户端,服务端
客户端:浏览器
服务端:自定义
在浏览器中输入本机地址和端口访问服务端,
也可以在dos命令行下进行
telnet localhost 5000
mport java.net.*;
import java.io.*;
class ServerDemo
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(5000);
Socket s = ss.accept();
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("<font color='red'size='7'>客户端你好!!!</font>");
s.close();
ss.close();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------