----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------
黑马程序员_java高级篇网络编程TCP实战Day8(下)
这个个博客中将涉及到TCP的简单的图片上传, 图片的并发上传
, 客户端并发登陆.
(一)图片上传
图片上传像网络编程TCP实战Day8(上)中的文本上传,差别在于源不一样,上次读的是文本,而这次读的是图片.上次用到的上字符流,现在要用字节流。当服务端用到了while时,记住这是我们在客户端要用s.shutdownOutput();告诉服务端。
客户端:
public class PhotoCopyClient {
/**
* @param args图片上传
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.out.println(InetAddress.getLocalHost().getHostAddress());
//建立服务
Socket s=new Socket("192.168.1.100",10021);
//建立输入流,读取图片
BufferedInputStream br=new BufferedInputStream(new FileInputStream("d:/12.jpg"));
//建立输出流将图片上传到服务器
BufferedOutputStream bw=new BufferedOutputStream(s.getOutputStream());
int len=0;
while((len=br.read())!=-1)
{
bw.write(len);
bw.flush();
}
// bw.write("over");
// bw.newLine();
// bw.flush();
s.shutdownOutput();//关闭客户端的输出流相当于给流加上一个结束标记
BufferedReader br1=new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br1.readLine());
//关闭流,时注意
bw.close();
s.close();
}
}
服务端:
ServerSocket ss=new ServerSocket(10021);
Socket s=ss.accept();
BufferedInputStream br=new BufferedInputStream(s.getInputStream());
BufferedOutputStream bw=new BufferedOutputStream( new FileOutputStream("d:/c_12.jpg"));
int len=0;
while((len=br.read())!=-1)
{
bw.write(len);
bw.flush();
}
BufferedWriter bw1=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw1.write("上传成功!");
bw1.newLine();
bw1.flush();
bw.close();
br.close();
ss.close();
(二) 图片的并发上传
由于,我们在现实中不可能只有一个用户在上传图片,这就要涉及到多用户的并发问题了,第一想到的就是线程。这样才可以让他们互不干扰。
客户端就不用改了,用(一)的,但是服务端要改,这贴出关键代码之前,先说明一个问题。
在代码中用到了
//得到IP是为了确定不同的用户
ip=InetAddress.getLocalHost().getAddress().toString();
//新建文件名 ,count++用于计数,让不同的图片有不同的名字。
f=new File("d:"+File.separator+ip+(count++)+".jpg");
//如果文件存在,我们必须再去建立。这个弯,其实把代码去运行一遍就知道了。
if(f.exists())
{
f=new File("d:"+File.separator+ip+(count++)+".jpg");
}
服务端(关键代码
class shangchuan implements Runnable
{
private Socket ss;
public shangchuan(Socket ss)
{
this.ss=ss;
}
public void run() {
// TODO Auto-generated method stub
String ip="";
File f = null;
int count=0;
try {
ip=InetAddress.getLocalHost().getAddress().toString();
f=new File("d:"+File.separator+ip+(count++)+".jpg");
if(f.exists())
{
f=new File("d:"+File.separator+ip+(count++)+".jpg");
}
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BufferedInputStream br;
try {
br = new BufferedInputStream(ss.getInputStream());
BufferedOutputStream bw=new BufferedOutputStream( new FileOutputStream(f));
int len=0;
while((len=br.read())!=-1)
{
bw.write(len);
bw.flush();
}
BufferedWriter bw1=new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));
bw1.write("上传成功!");
bw1.newLine();
bw1.flush();
bw.close();
br.close();
ss.close();
效果(在上传完成之前,你可以去你上传的位置看那张图片,你会看到上传的效果):
(三)客户端并发登陆,我的做的比较简单,就是实现了一下原理,不停登录,当用户登录次数超过时,要提示。其实也就是一个向服务端发文本,服务端在发文本过来的交互程序。我的是单个用户的,你可以将其用户名写入文件中,当用户登录时,查询一下。
客户端:
Socket socket=new Socket("192.168.1.102",11111);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str="";
while((str=br.readLine())!=null)
{
bw.write(str);
bw.newLine();
bw.flush();
}
System.out.println("服务器:"+br1.readLine());
System.out.println("niahoa");
//socket.shutdownInput();
//socket.shutdownOutput();
socket.shutdownOutput();
//System.out.println(InetAddress.getLocalHost().getHostAddress());
br.close();
socket.close();
ServerSocket sersocket=new ServerSocket(11111);
Socket socket=sersocket.accept();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br1=new BufferedReader(new InputStreamReader(socket.getInputStream()));
for(int i=0;i<3;i++)
{
//System.out.println(br1.readLine());
String str="";
if((str=br1.readLine()).equals("123"))
{
System.out.println("232");
System.out.println(str);
bw.write(str);
bw.newLine();
bw.flush();
System.out.println(str);
}else{
System.out.println("123");
System.out.println(str+"不存在");
bw.write(str);
bw.newLine();
bw.flush();
}
}
sersocket.close();
---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------