黑马程序员技术交流社区
标题:
【基础视频学习】网络编程与多线程结合
[打印本页]
作者:
泛大陆
时间:
2015-7-27 21:33
标题:
【基础视频学习】网络编程与多线程结合
实现服务器能同时接收多个客户端访问
import java.io.*;
import java.net.*;
class NtClient//客户端
{
public static void sop(Object obj)//自定义输出方法
{
System.out.println(obj);
}
public static void main(String[] args)throws Exception
{
if(args.length!=1)//判断是否传入参数
{
sop("请选择一个jpg格式的图片");
return;
}
File file=new File(args[0]);//将图片地址转换为File对象
if(!(file.exists()&&file.isFile()))
{
sop("文件有问题");
return;
}
if(!file.getName().endsWith(".jpg"))
{
sop("图片格式错误");
return;
}
if(file.length()>1024*1024*5)
{
sop("文件过大");
return;
}
Socket s=new Socket("127.0.0.1",10005);//连接服务器及端口
FileInputStream fis=new FileInputStream(file);//创建流输入对象
OutputStream out=s.getOutputStream();//创建流输出对象
byte[] buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1)
{
out.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();
}
}
class NtThread implements Runnable//实现多线程上传
{
private Socket s;
NtThread(Socket s)
{
this.s=s;
}
public void run()
{
String ip=s.getInetAddress().getHostAddress();//客户端地址
try
{
int count=1;
System.out.println(ip+"...connected");
InputStream in=s.getInputStream();//接收数据
File file=new File(ip+"("+(count)+").jpg");//创建服务器端文件
while(file.exists())
file=new File(ip+"("+(count++)+").jpg");
FileOutputStream out=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)//将接收数据写入服务器端文件中
{
out.write(buf,0,len);
}
OutputStream op=s.getOutputStream();//往客户端返回信息
op.write("上传完成".getBytes());
out.close();
s.close();
}
catch(Exception e)
{
throw new RuntimeException(ip+"上传失败");
}
}
}
class NtServer//服务器端
{
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10005);
while(true)
{
Socket s=ss.accept();
new Thread(new NtThread(s)).start();
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2