`

TCP网络编程【实例】

 
阅读更多

TCP实例一
文章来源:http://blog.csdn.net/webrobot/article/details/7425078

  1. packagecom.nbchina.tcp1;
  2. importjava.io.IOException;
  3. importjava.io.OutputStream;
  4. importjava.net.Socket;
  5. publicclassTcpClinet{
  6. publicstaticvoidmain(String[]args)throwsException,IOException{
  7. Sockets=newSocket("192.168.1.68",10003);
  8. OutputStreamout=s.getOutputStream();
  9. out.write("Tcpsenddata...".getBytes());
  10. s.close();
  11. }
  12. }
  13. packagecom.nbchina.tcp1;
  14. importjava.io.IOException;
  15. importjava.io.InputStream;
  16. importjava.net.ServerSocket;
  17. importjava.net.Socket;
  18. //服务端、客户端通讯,服务端守候并显示客户端发来的信息
  19. publicclassTcpServer{
  20. publicstaticvoidmain(String[]args)throwsIOException{
  21. //建立服务端socket服务,并监听一个端口
  22. ServerSocketss=newServerSocket(10003);
  23. //通过accept方法获取连接来的客户端对象
  24. Sockets=ss.accept();
  25. Stringip=s.getInetAddress().getHostAddress();
  26. System.out.println(ip+"...connected");
  27. //获取客户端发来的数据
  28. InputStreamis=s.getInputStream();
  29. byte[]buf=newbyte[1024];
  30. intlen=is.read(buf);
  31. System.out.println(newString(buf,0,len));
  32. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  33. ss.close();//关闭服务端
  34. }
  35. }


TCP实例二

  1. packagecom.nbchina.tcp2;
  2. importjava.io.InputStream;
  3. importjava.io.OutputStream;
  4. importjava.net.Socket;
  5. publicclassTcpClinet{
  6. publicstaticvoidmain(String[]args)throwsException{
  7. Sockets=newSocket("192.168.1.68",10008);
  8. OutputStreamout=s.getOutputStream();
  9. out.write("Tcpsenddata...".getBytes());
  10. InputStreamis=s.getInputStream();
  11. byte[]buf=newbyte[1024];
  12. intlen=is.read(buf);
  13. System.out.println(newString(buf,0,len));
  14. s.close();
  15. }
  16. }
  17. packagecom.nbchina.tcp2;
  18. importjava.io.InputStream;
  19. importjava.io.OutputStream;
  20. importjava.net.ServerSocket;
  21. importjava.net.Socket;
  22. //客户端、服务端通讯互相发送消息
  23. publicclassTcpServer{
  24. publicstaticvoidmain(String[]args)throwsException{
  25. //建立服务端socket服务,并监听一个端口
  26. ServerSocketss=newServerSocket(10008);
  27. //通过accept方法获取连接来的客户端对象
  28. Sockets=ss.accept();
  29. Stringip=s.getInetAddress().getHostAddress();
  30. System.out.println(ip+"...connected");
  31. //获取客户端发来的数据
  32. InputStreamis=s.getInputStream();
  33. byte[]buf=newbyte[1024];
  34. intlen=is.read(buf);
  35. System.out.println(newString(buf,0,len));
  36. OutputStreamout=s.getOutputStream();
  37. out.write("收到客户端发来的信息".getBytes());
  38. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  39. ss.close();//关闭服务端
  40. }
  41. }


TCP实例三

  1. packagecom.nbchina.tcp3;
  2. importjava.io.BufferedReader;
  3. importjava.io.BufferedWriter;
  4. importjava.io.InputStreamReader;
  5. importjava.io.OutputStreamWriter;
  6. importjava.io.PrintWriter;
  7. importjava.net.Socket;
  8. publicclassTcpClinet{
  9. publicstaticvoidmain(String[]args)throwsException{
  10. Sockets=newSocket("192.168.1.2",10008);
  11. BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
  12. //BufferedWriterbufOut=newBufferedWriter(newOutputStreamWriter(s.getOutputStream()));
  13. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  14. PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  15. Stringline=null;
  16. while((line=bufr.readLine())!=null){
  17. if("over".equals(line)){
  18. break;
  19. }
  20. out.println(line);
  21. /*bufOut.write(line);
  22. bufOut.newLine();
  23. bufOut.flush();*/
  24. Stringstr=bufIn.readLine();
  25. System.out.println("server:"+str);
  26. }
  27. bufr.close();
  28. s.close();
  29. }
  30. }
  31. packagecom.nbchina.tcp3;
  32. importjava.io.BufferedReader;
  33. importjava.io.BufferedWriter;
  34. importjava.io.InputStreamReader;
  35. importjava.io.OutputStreamWriter;
  36. importjava.io.PrintWriter;
  37. importjava.net.ServerSocket;
  38. importjava.net.Socket;
  39. //客户端、服务端通讯互相发送消息
  40. /*
  41. *要求建立一个文本转换服务端
  42. *客户端发给服务端文本,服务端将文本转换为大写返回给客户端。
  43. *而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
  44. *分析:
  45. *客户端:
  46. *既然是操作设备上的数据,可以用io技术,并按照io的操作规则来思考。
  47. *源:键盘录入
  48. *目的:网络设备,网络输出流。
  49. *而且操作的是文本数据,可以选择字符流。
  50. *
  51. *步骤
  52. *1、建立服务
  53. *2、获取键盘录入
  54. *3、将数据发给服务端
  55. *4、服务端返回大写数据
  56. *5、结束、关闭资源
  57. *
  58. *都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。
  59. *
  60. */
  61. publicclassTcpServer{
  62. publicstaticvoidmain(String[]args)throwsException{
  63. //建立服务端socket服务,并监听一个端口
  64. ServerSocketss=newServerSocket(10008);
  65. //通过accept方法获取连接来的客户端对象
  66. Sockets=ss.accept();
  67. Stringip=s.getInetAddress().getHostAddress();
  68. System.out.println(ip+"...connected");
  69. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  70. //BufferedWriterbufOut=newBufferedWriter(newOutputStreamWriter(s.getOutputStream()));
  71. //既可以接受字节流又可以接受字符流
  72. //PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  73. PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  74. Stringline=null;
  75. while((line=bufIn.readLine())!=null){
  76. out.println(line.toUpperCase());
  77. /*bufOut.write(line.toUpperCase());
  78. bufOut.newLine();
  79. bufOut.flush();*/
  80. }
  81. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  82. ss.close();//关闭服务端
  83. }
  84. }



TCP实例四

  1. packagecom.nbchina.tcp4;
  2. importjava.io.BufferedReader;
  3. importjava.io.FileReader;
  4. importjava.io.InputStreamReader;
  5. importjava.io.PrintWriter;
  6. importjava.net.Socket;
  7. //通过tcp复制文本文件。
  8. //注意使用流结束标志。
  9. //一般使用流结束标志。也可以自定义标志。
  10. publicclassTcpClinet{
  11. publicstaticvoidmain(String[]args)throwsException{
  12. Sockets=newSocket("192.168.1.2",10008);
  13. BufferedReaderbufr=newBufferedReader(newFileReader("IPDeom.java"));
  14. PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  15. /*DataOutputStreamdos=newDataOutputStream(s.getOutputStream());
  16. longtime=System.currentTimeMillis();
  17. dos.writeLong(time);*/
  18. Stringline=null;
  19. while((line=bufr.readLine())!=null){
  20. out.println(line);
  21. }
  22. s.shutdownOutput();//一般使用关闭客户端输出流,相当于给流加入一个结束标记
  23. //dos.writeLong(time);//使用时间戳作为结束标志
  24. //out.println("over");//输出结束,供服务端判断。否则双方都在等待
  25. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  26. Stringstr=bufIn.readLine();
  27. System.out.println("server:"+str);
  28. bufr.close();
  29. s.close();
  30. }
  31. }
  32. packagecom.nbchina.tcp4;
  33. importjava.io.BufferedReader;
  34. importjava.io.DataInputStream;
  35. importjava.io.FileWriter;
  36. importjava.io.InputStreamReader;
  37. importjava.io.PrintWriter;
  38. importjava.net.ServerSocket;
  39. importjava.net.Socket;
  40. //(TCP复制文件)
  41. /*
  42. *
  43. */
  44. publicclassTcpServer{
  45. publicstaticvoidmain(String[]args)throwsException{
  46. //建立服务端socket服务,并监听一个端口
  47. ServerSocketss=newServerSocket(10008);
  48. //通过accept方法获取连接来的客户端对象
  49. Sockets=ss.accept();
  50. Stringip=s.getInetAddress().getHostAddress();
  51. System.out.println(ip+"...connected");
  52. DataInputStreamdis=newDataInputStream(s.getInputStream());
  53. longl=dis.readLong();
  54. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  55. PrintWriterout=newPrintWriter(newFileWriter("server.txt"),true);
  56. Stringline=null;
  57. while((line=bufIn.readLine())!=null){
  58. /*if("over".equals(line))
  59. break;*/
  60. out.println(line);
  61. }
  62. PrintWriterpw=newPrintWriter(s.getOutputStream(),true);
  63. pw.println("上传成功");
  64. out.close();
  65. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  66. ss.close();//关闭服务端
  67. }
  68. }



TCP实例五

  1. packagecom.nbchina.tcp5;
  2. importjava.io.FileInputStream;
  3. importjava.io.InputStream;
  4. importjava.io.OutputStream;
  5. importjava.net.Socket;
  6. //通过tcp复制图片文件。
  7. publicclassTcpClinet{
  8. publicstaticvoidmain(String[]args)throwsException{
  9. Sockets=newSocket("192.168.1.2",10008);
  10. FileInputStreamfis=newFileInputStream("1.bmp");
  11. OutputStreamout=s.getOutputStream();
  12. byte[]buf=newbyte[1024];
  13. intlen=0;
  14. while((len=fis.read(buf))!=-1){
  15. out.write(buf,0,len);
  16. }
  17. s.shutdownOutput();
  18. InputStreamin=s.getInputStream();
  19. byte[]bufIn=newbyte[1024];
  20. intnum=in.read(bufIn);
  21. System.out.println(newString(bufIn,0,num));
  22. fis.close();
  23. s.close();
  24. }
  25. }
  26. packagecom.nbchina.tcp5;
  27. importjava.io.FileOutputStream;
  28. importjava.io.InputStream;
  29. importjava.io.OutputStream;
  30. importjava.net.ServerSocket;
  31. importjava.net.Socket;
  32. /*
  33. *单人上传图片
  34. */
  35. publicclassTcpServer{
  36. publicstaticvoidmain(String[]args)throwsException{
  37. //建立服务端socket服务,并监听一个端口
  38. ServerSocketss=newServerSocket(10008);
  39. //通过accept方法获取连接来的客户端对象
  40. Sockets=ss.accept();
  41. Stringip=s.getInetAddress().getHostAddress();
  42. System.out.println(ip+"...connected");
  43. InputStreamin=s.getInputStream();
  44. FileOutputStreamfos=newFileOutputStream("server.bmp");
  45. byte[]buf=newbyte[1024];
  46. intlen=0;
  47. while((len=in.read(buf))!=-1){
  48. fos.write(buf,0,len);
  49. }
  50. OutputStreamout=s.getOutputStream();
  51. out.write("上传成功".getBytes());
  52. fos.close();
  53. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  54. ss.close();//关闭服务端
  55. }
  56. }


TCP实例六

  1. packagecom.nbchina.tcp6;
  2. importjava.io.File;
  3. importjava.io.FileInputStream;
  4. importjava.io.InputStream;
  5. importjava.io.OutputStream;
  6. importjava.net.Socket;
  7. //通过tcp复制图片文件。
  8. publicclassTcpClinet{
  9. publicstaticvoidmain(String[]args)throwsException{
  10. if(args.length!=1){
  11. System.out.println("请选择一个jpg格式的图片");
  12. return;
  13. }
  14. Filefile=newFile(args[0]);
  15. if(!(file.exists()&&file.isFile())){
  16. System.out.println("该文件有问题,不存在或者不是文件");
  17. return;
  18. }
  19. if(!file.getName().endsWith(".jpg")){
  20. System.out.println("格式错误");
  21. return;
  22. }
  23. if(file.length()>1024*1024*5){
  24. System.out.println("文件过大");
  25. return;
  26. }
  27. Sockets=newSocket("192.168.1.2",10008);
  28. FileInputStreamfis=newFileInputStream(file);
  29. OutputStreamout=s.getOutputStream();
  30. byte[]buf=newbyte[1024];
  31. intlen=0;
  32. while((len=fis.read(buf))!=-1){
  33. out.write(buf,0,len);
  34. }
  35. s.shutdownOutput();
  36. InputStreamin=s.getInputStream();
  37. byte[]bufIn=newbyte[1024];
  38. intnum=in.read(bufIn);
  39. System.out.println(newString(bufIn,0,num));
  40. fis.close();
  41. s.close();
  42. }
  43. }
  44. packagecom.nbchina.tcp6;
  45. importjava.io.File;
  46. importjava.io.FileOutputStream;
  47. importjava.io.InputStream;
  48. importjava.io.OutputStream;
  49. importjava.net.ServerSocket;
  50. importjava.net.Socket;
  51. /*
  52. *并发上传图片
  53. */
  54. classPicTreadimplementsRunnable{
  55. privateSockets;
  56. PicTread(Sockets){
  57. this.s=s;
  58. }
  59. publicvoidrun(){
  60. intcount=1;
  61. Stringip=s.getInetAddress().getHostAddress();
  62. try{
  63. System.out.println(ip+"...connected");
  64. InputStreamin=s.getInputStream();
  65. Filefile=newFile(ip+"("+(count)+")"+".jpg");
  66. while(file.exists()){
  67. file=newFile(ip+"("+(count)+")"+".jpg");
  68. }
  69. FileOutputStreamfos=newFileOutputStream(file);
  70. byte[]buf=newbyte[1024];
  71. intlen=0;
  72. while((len=in.read(buf))!=-1){
  73. fos.write(buf,0,len);
  74. }
  75. OutputStreamout=s.getOutputStream();
  76. out.write((ip+"上传成功").getBytes());
  77. fos.close();
  78. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  79. }catch(Exceptione){
  80. thrownewRuntimeException(ip+"上传失败");
  81. }
  82. }
  83. }
  84. publicclassTcpServer{
  85. publicstaticvoidmain(String[]args)throwsException{
  86. //建立服务端socket服务,并监听一个端口
  87. ServerSocketss=newServerSocket(10008);
  88. while(true){
  89. Sockets=ss.accept();
  90. newThread(newPicTread(s)).start();
  91. }
  92. //ss.close();//关闭服务端
  93. }
  94. }


TCP实例七

  1. packagecom.nbchina.tcp7;
  2. importjava.io.BufferedReader;
  3. importjava.io.InputStreamReader;
  4. importjava.io.PrintWriter;
  5. importjava.net.Socket;
  6. //通过tcp登录
  7. publicclassTcpClinet{
  8. publicstaticvoidmain(String[]args)throwsException{
  9. Sockets=newSocket("192.168.1.2",10008);
  10. BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
  11. PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  12. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  13. for(intx=0;x<3;x++){
  14. Stringline=bufr.readLine();
  15. if(line==null)
  16. break;
  17. out.println(line);
  18. Stringinfo=bufIn.readLine();
  19. System.out.println("info:"+info);
  20. if(info.contains("欢迎")){
  21. break;
  22. }
  23. }
  24. bufr.close();
  25. s.close();
  26. }
  27. }
  28. packagecom.nbchina.tcp7;
  29. importjava.io.BufferedReader;
  30. importjava.io.FileReader;
  31. importjava.io.InputStreamReader;
  32. importjava.io.PrintWriter;
  33. importjava.net.ServerSocket;
  34. importjava.net.Socket;
  35. /*
  36. *
  37. */
  38. classUserTreadimplementsRunnable{
  39. privateSockets;
  40. UserTread(Sockets){
  41. this.s=s;
  42. }
  43. publicvoidrun(){
  44. Stringip=s.getInetAddress().getHostAddress();
  45. System.out.println(ip+"...connected");
  46. try{
  47. for(intx=0;x<3;x++){
  48. BufferedReaderbufIn=newBufferedReader(newInputStreamReader(s.getInputStream()));
  49. Stringname=bufIn.readLine();
  50. if(name==null){
  51. break;
  52. }
  53. BufferedReaderbufr=newBufferedReader(newFileReader("user.txt"));
  54. PrintWriterout=newPrintWriter(s.getOutputStream(),true);
  55. Stringline=null;
  56. booleanflag=false;
  57. while((line=bufr.readLine())!=null){
  58. if(line.equals(name)){
  59. flag=true;
  60. break;
  61. }
  62. }
  63. if(flag){
  64. System.out.println(name+"已经登录");
  65. out.println(name+"欢迎光临");
  66. break;
  67. }else{
  68. System.out.println(name+"尝试登录");
  69. out.println(name+"不存在");
  70. }
  71. }
  72. s.close();//关闭客户端。服务端关的不是自己。是客户端。
  73. }catch(Exceptione){
  74. thrownewRuntimeException(ip+"登录失败");
  75. }
  76. }
  77. }
  78. publicclassTcpServer{
  79. publicstaticvoidmain(String[]args)throwsException{
  80. //建立服务端socket服务,并监听一个端口
  81. ServerSocketss=newServerSocket(10008);
  82. while(true){
  83. Sockets=ss.accept();
  84. newThread(newUserTread(s)).start();
  85. }
  86. //ss.close();//关闭服务端
  87. }
  88. }


TCP实例八 ---->服务消息转换

  1. packagecom.nbchina.tcp.client;
  2. importjava.io.BufferedReader;
  3. importjava.io.DataInputStream;
  4. importjava.io.DataOutputStream;
  5. importjava.io.IOException;
  6. importjava.io.InputStreamReader;
  7. importjava.net.InetAddress;
  8. importjava.net.Socket;
  9. importjava.util.logging.Level;
  10. importjava.util.logging.Logger;
  11. importcom.nbchina.tcp.server.Server;
  12. /**
  13. *此类模拟客户端发出更新请求,在运行期间会要求用户输入指令码
  14. *举例:输入FDFCF802AAAAAAAAAAAAAAAAAAAAAAAA0000X,详细查看《端口与服务器通讯协议》
  15. *此类可以多次运行,从而模拟多个终端如果输入的指令码错误,服务器将不予解析
  16. *
  17. */
  18. publicclassClient{
  19. protectedstaticLoggerlogger=Logger.getLogger(Server.class.getName());
  20. static{
  21. logger.setLevel(Level.ALL);//查看所有跟踪信息
  22. }
  23. publicvoidcall(){
  24. intp=0;
  25. DataInputStreamin;
  26. DataOutputStreamout;
  27. Socketsocket=null;
  28. try{
  29. socket=newSocket(InetAddress.getByName(null),Server.PORT_SERVER);
  30. /*
  31. *确保一个进程关闭Socket后,即使他还未释放端口,同一个主机的其他进程还可以立即重用该端口,
  32. *可调用socket.setReuseAddress(true),默认false
  33. */
  34. socket.setReuseAddress(true);
  35. p=socket.getLocalPort();//获取本地TCP端口,用于区分不同的客户端
  36. logger.info("新建客户端连接@"+p);
  37. in=newDataInputStream(socket.getInputStream());
  38. out=newDataOutputStream(socket.getOutputStream());
  39. System.out.print("请输入指令字符串(以回车键结束,以FDFCF8开头):");
  40. BufferedReaderline=newBufferedReader(newInputStreamReader(
  41. System.in));
  42. Strings=line.readLine();
  43. //将字符串转换成字节数组
  44. for(intii:s2a(s)){
  45. out.write(ii);
  46. }
  47. out.flush();
  48. socket.shutdownOutput();//发送指令完毕
  49. //接收服务端响应
  50. StringBuffersb=newStringBuffer();
  51. while(true){
  52. try{
  53. intb=in.readUnsignedByte();
  54. sb.append(Integer.toHexString(b));
  55. }catch(Exceptione){
  56. break;
  57. }
  58. }
  59. sb.insert(0,"收到了服务器响应:");
  60. System.out.println(sb.toString().toUpperCase());
  61. in.close();
  62. out.close();
  63. logger.info("客户端关闭@"+p);
  64. }catch(IOExceptione){
  65. logger.severe(e.getMessage());
  66. e.printStackTrace();
  67. }finally{
  68. try{
  69. if(socket!=null)
  70. socket.close();
  71. }catch(IOExceptione){
  72. e.printStackTrace();
  73. }
  74. }
  75. }
  76. publicstaticvoidmain(String[]args){
  77. newClient().call();
  78. //int[]b=GportClient.s2a("20EFD23FE");
  79. //for(intbi:b){
  80. //System.out.println(bi);
  81. //}
  82. }
  83. staticint[]s2a(Strings){
  84. if(s==null||"".equals(s))returnnewint[0];
  85. StringBuffersb=newStringBuffer(s);
  86. int[]ba=newint[sb.length()/2+sb.length()%2];
  87. intl=sb.length();
  88. for(inti=0,c=0;i<l;i++,c++){
  89. Stringtmp=""+sb.charAt(i++);
  90. if(i<l)
  91. tmp+=sb.charAt(i);
  92. ba[c]=Integer.parseInt(tmp,16);
  93. }
  94. returnba;
  95. }
  96. }
  97. packagecom.nbchina.tcp.server;
  98. importjava.io.IOException;
  99. importjava.net.InetAddress;
  100. importjava.net.ServerSocket;
  101. importjava.net.Socket;
  102. importjava.util.logging.Level;
  103. importjava.util.logging.Logger;
  104. importcom.nbchina.tcp.msg.DisconnectMessage;
  105. importcom.nbchina.tcp.msg.Message;
  106. /**
  107. *守护的通信服务器,可以启动和关闭<br>
  108. *启动后,服务器运行一个守护线程负责接收终端更新请求,并分配给解析器解析编码提供通用的socket发送和接收功能
  109. *
  110. */
  111. publicclassServerextendsServerSocket{
  112. protectedstaticLoggerlogger=Logger.getLogger(Server.class.getName());
  113. static{
  114. logger.setLevel(Level.ALL);//查看所有跟踪信息
  115. }
  116. publicstaticfinalintPORT_SERVER=10000;
  117. publicstaticfinalintMSG_MAX_LENGTH=1024;
  118. privatestaticServerserver;
  119. publicstaticServernewInstant(){
  120. if(server==null){
  121. try{
  122. server=newServer();
  123. }catch(IOExceptione){
  124. //TODOAuto-generatedcatchblock
  125. e.printStackTrace();
  126. }
  127. }
  128. returnserver;
  129. }
  130. privateServer()throwsIOException{
  131. super(PORT_SERVER);
  132. }
  133. publicvoidstart(){
  134. try{
  135. while(true){
  136. Socketsocket=this.accept();
  137. logger.info("建立新会话");
  138. //newInstant(socket).start();InstantextendsThread修改为InstantimplementsRunnable
  139. newThread(newInstant(socket)).start();
  140. }
  141. }catch(Exceptione){
  142. logger.severe("服务器启动或接收数据失败:"+e.getMessage());
  143. }finally{
  144. try{
  145. logger.info("关闭服务器");
  146. super.close();
  147. }catch(IOExceptione){
  148. logger.severe("服务器关闭失败:"+e.getMessage());
  149. }
  150. }
  151. }
  152. /**
  153. *一个服务器实例,根据目前设计,一个终端的一次会话对应一个实例
  154. *单例模式,懒汉
  155. */
  156. publicstaticclassInstantimplementsRunnable{
  157. privateSocketsocket;
  158. publicInstant(Socketsocket){
  159. this.socket=socket;
  160. }
  161. publicSocketgetSocket(){
  162. returnsocket;
  163. }
  164. publicvoidrun(){
  165. logger.info("成功创建一个连接,等待客户端数据");
  166. Messagereponse;
  167. try{
  168. reponse=newReceiver(socket).process();
  169. logger.info("数据处理完成,发送响应");
  170. Sendersender=newSender(socket);
  171. if(reponse!=null){
  172. sender.send(reponse);
  173. }
  174. //总在最后发送关闭消息
  175. Messageclose=newDisconnectMessage();
  176. sender.send(close);
  177. logger.info("连接处理完成并关闭");
  178. }catch(Exceptione){
  179. InetAddressad=socket.getInetAddress();
  180. logger.warning("消息处理发生错误:"+e.getMessage()+"@"+ad.getCanonicalHostName());
  181. }finally{
  182. try{
  183. socket.close();
  184. }catch(IOExceptione){
  185. e.printStackTrace();
  186. }
  187. }
  188. }
  189. }
  190. publicstaticvoidmain(String[]args){
  191. logger.info("开始启动服务器");
  192. Server.newInstant().start();
  193. }
  194. }
  195. packagecom.nbchina.tcp.server;
  196. importjava.net.Socket;
  197. importjava.util.logging.Logger;
  198. importcom.nbchina.tcp.dao.StubDao;
  199. importcom.nbchina.tcp.msg.Message;
  200. importcom.nbchina.tcp.msg.ResponseMessage;
  201. importcom.nbchina.tcp.msg.UpdateMessage;
  202. /**
  203. *接收并解析编码
  204. *
  205. */
  206. publicclassReceiver{
  207. protectedstaticLoggerlogger=Logger.getLogger(Receiver.class.getName());
  208. privateSocketsocket;
  209. privateStubDaodao;
  210. publicReceiver(Socketsocket){
  211. this.socket=socket;
  212. this.dao=newStubDao();
  213. }
  214. publicMessageprocess()throwsException{
  215. UpdateMessagerequest=newUpdateMessage(socket.getInputStream());
  216. //判断是否是处理过的终端
  217. Stringid=request.getId();
  218. if(!dao.hasRegister(id)){
  219. //未处理过的,先注册(注册完以后,也应该查询是否有更新,可能是服务端已经录入了终端的注册信息)
  220. dao.register(id);
  221. }
  222. Messagereponse=null;
  223. if(dao.isUpdated(id)){
  224. //是处理过的,查询更新信息
  225. reponse=newResponseMessage(dao.fillMessageDetail(id));
  226. }
  227. returnreponse;
  228. }
  229. }
  230. packagecom.nbchina.tcp.server;
  231. importjava.io.DataOutputStream;
  232. importjava.net.Socket;
  233. importjava.util.logging.Logger;
  234. importcom.nbchina.tcp.msg.Message;
  235. /**
  236. *负责发送消息
  237. */
  238. publicclassSender{
  239. protectedstaticLoggerlogger=Logger.getLogger(Sender.class.getName());
  240. privateSocketsocket;
  241. publicSender(Socketsocket){
  242. this.socket=socket;
  243. }
  244. publicvoidsend(Messagemsg)throwsException{
  245. DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());
  246. int[]data=msg.getData();
  247. for(intd:data){
  248. dos.write(d);
  249. }
  250. dos.flush();
  251. }
  252. }
  253. .....还有其他一些类

 

网络获取图片、html

  1. publicclassHtmlRequest{
  2. publicstaticvoidmain(String[]args)throwsException{
  3. URLurl=newURL("http://www.sohu.com/");
  4. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  5. conn.setRequestMethod("GET");
  6. conn.setConnectTimeout(5*1000);
  7. InputStreaminStream=conn.getInputStream();//通过输入流获取html数据
  8. byte[]data=readInputStream(inStream);//得到html的二进制数据
  9. Stringhtml=newString(data,"utf-8");
  10. System.out.println(html);
  11. /*FileimageFile=newFile("nbchina.htm");
  12. FileOutputStreamoutStream=newFileOutputStream(imageFile);
  13. outStream.write(data);
  14. outStream.close();*/
  15. }
  16. publicstaticbyte[]readInputStream(InputStreaminStream)throwsException{
  17. ByteArrayOutputStreamoutStream=newByteArrayOutputStream();
  18. byte[]buffer=newbyte[1024];
  19. intlen=0;
  20. while((len=inStream.read(buffer))!=-1){
  21. outStream.write(buffer,0,len);
  22. }
  23. inStream.close();
  24. returnoutStream.toByteArray();
  25. }
  26. }
  27. publicclassImageRequest{
  28. publicstaticvoidmain(String[]args)throwsException{
  29. URLurl=newURL("http://img04.taobaocdn.com/bao/uploaded/i4/T1hTSvXihAXXbeLMw1_041248.jpg_b.jpg");
  30. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  31. conn.setRequestMethod("GET");
  32. conn.setConnectTimeout(5*1000);
  33. InputStreaminStream=conn.getInputStream();//通过输入流获取图片数据
  34. byte[]data=readInputStream(inStream);//得到图片的二进制数据
  35. FileimageFile=newFile("nbchina.jpg");
  36. FileOutputStreamoutStream=newFileOutputStream(imageFile);
  37. outStream.write(data);
  38. outStream.close();
  39. }
  40. publicstaticbyte[]readInputStream(InputStreaminStream)throwsException{
  41. ByteArrayOutputStreamoutStream=newByteArrayOutputStream();
  42. byte[]buffer=newbyte[1024];
  43. intlen=0;
  44. while((len=inStream.read(buffer))!=-1){
  45. outStream.write(buffer,0,len);
  46. }
  47. inStream.close();
  48. returnoutStream.toByteArray();
  49. }
  50. }


多线程下载

  1. publicclassMulThreadDownload{
  2. publicstaticvoidmain(String[]args){
  3. Stringpath="http://dl_dir.qq.com/qqfile/qq/QQ2011/QQ2011.exe";
  4. try{
  5. newMulThreadDownload().download(path,5);
  6. }catch(Exceptione){
  7. e.printStackTrace();
  8. }
  9. }
  10. /**
  11. *从路径中获取文件名称
  12. *@parampath下载路径
  13. *@return
  14. */
  15. publicstaticStringgetFilename(Stringpath){
  16. returnpath.substring(path.lastIndexOf('/')+1);
  17. }
  18. /**
  19. *下载文件
  20. *@parampath下载路径
  21. *@paramthreadsize线程数
  22. */
  23. publicvoiddownload(Stringpath,intthreadsize)throwsException{
  24. URLurl=newURL(path);
  25. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  26. conn.setRequestMethod("GET");
  27. conn.setConnectTimeout(5*1000);
  28. intfilelength=conn.getContentLength();//获取要下载的文件的长度
  29. Stringfilename=getFilename(path);//从路径中获取文件名称
  30. FilesaveFile=newFile(filename);
  31. RandomAccessFileaccessFile=newRandomAccessFile(saveFile,"rwd");
  32. accessFile.setLength(filelength);//设置本地文件的长度和下载文件相同
  33. accessFile.close();
  34. //计算每条线程下载的数据长度
  35. intblock=filelength%threadsize==0?filelength/threadsize:filelength/threadsize+1;
  36. for(intthreadid=0;threadid<threadsize;threadid++){
  37. newDownloadThread(url,saveFile,block,threadid).start();
  38. }
  39. }
  40. privatefinalclassDownloadThreadextendsThread{
  41. privateURLurl;
  42. privateFilesaveFile;
  43. privateintblock;//每条线程下载的数据长度
  44. privateintthreadid;//线程id
  45. publicDownloadThread(URLurl,FilesaveFile,intblock,intthreadid){
  46. this.url=url;
  47. this.saveFile=saveFile;
  48. this.block=block;
  49. this.threadid=threadid;
  50. }
  51. @Override
  52. publicvoidrun(){
  53. //计算开始位置公式:线程id*每条线程下载的数据长度=?
  54. //计算结束位置公式:(线程id+1)*每条线程下载的数据长度-1=?
  55. intstartposition=threadid*block;
  56. intendposition=(threadid+1)*block-1;
  57. try{
  58. RandomAccessFileaccessFile=newRandomAccessFile(saveFile,"rwd");
  59. accessFile.seek(startposition);//设置从什么位置开始写入数据
  60. HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
  61. conn.setRequestMethod("GET");
  62. conn.setConnectTimeout(5*1000);
  63. conn.setRequestProperty("Range","bytes="+startposition+"-"+endposition);
  64. InputStreaminStream=conn.getInputStream();
  65. byte[]buffer=newbyte[1024];
  66. intlen=0;
  67. while((len=inStream.read(buffer))!=-1){
  68. accessFile.write(buffer,0,len);
  69. System.out.println("线程id:"+threadid+"下载["+len+"]");
  70. }
  71. inStream.close();
  72. accessFile.close();
  73. System.out.println("线程id:"+threadid+"下载完成");
  74. }catch(Exceptione){
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics