黑马程序员_java高级篇网络编程TCP实战Day8(下)

来源:互联网 发布:谷歌量子计算机 知乎 编辑:程序博客网 时间:2024/06/06 02:22

----------------------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 stubString 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 blocke1.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培训、期待与您交流! -----------

原创粉丝点击