嘿牛程序员__成都传智博客__网络编程(下)
2012-06-22 23:48
302 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
本节继续研究网络编程
我们还是以TCP网络编程为例,下面的例子是实现从客服端传入一个文件,然后在服务器端接受并保存
/**
*程序2
*该程序是服务端程序
*该程序实现传送一个文件,接收并保存
**/
import java.net.*;
import java.io.*;
class Servicer implements Runnable
{
Socket s;
public Servicer(Socket s)
{
this.s = s;
}
public void run()
{
try
{
//InputStream ips=s.getInputStream();
//OutputStream ops=s.getOutputStream();
//getInputStream public InputStream getInputStream() throws IOException返回此套接字的输入流。
//public BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个内部缓
冲区数组并将其存储在 buf 中。
//public DataInputStream(InputStream in)使用指定的底层 InputStream 创建一个 DataInputStream。
//它们之间的关系是
//java.lang.Object
//java.io.InputStream
// java.io.FilterInputStream
// java.io.DataInputStream
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("new1.txt")));//在当前目录下建立文件
byte buf[]=new byte[2048];
int i=0;
while((i=dis.read(buf))!=-1)
{dos.write(buf,0,i); }//将内容写入到new1.txt文件中
dos.flush(); //将缓冲区中的内容存入流中,如果没有此步,数据不会写入文件
dos.close();
dis.close();
s.close();
}catch(Exception e){e.printStackTrace();}
}
}
class TcpServer
{
public static void main(String [] args)
{
try
{
ServerSocket ss=new ServerSocket(8001);//定义端口,8000、8001为通用接口
//ServerSocket ss=new ServerSocket(0);//获取当前接口
//int i=ss.getLocalPort();
System.out.println("sever 正在运行"+"端口号为:"+ss.getLocalPort());
while(true)
{
Socket s=ss.accept();
new Thread(new Servicer(s)).start();
}
//ss.close();
}catch(Exception e){e.printStackTrace();}
}
}
/*
*程序2可能存在的问题
*
(1)Connection reset by peer
执行 第三步的While循环可能产生连接关闭异常,
原因:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉,连接并发数由backlog控制,默认值为5。
backlog: 用于在TCP层接收链接的缓冲池的最大个数,这个个数可在应用层中的listen函数里设置,当客户链接请求大于这个个数(缓冲池满),其它的未
进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时(大约57秒后)
解决:1.增加Byte buf[]=new Byte[len];len的值,以减少连接次数,减少While循环的次数。
2 增加并发连接数的值,把serversocket的backlog设置为200。
(2)dos.flush()不调用此方法,刚数据会存在于缓冲区中,但不会写入文件或对应的流中。
*/
/**
*程序2
*该程序是客户端程序
*该程序实现传送一个文件,接收并保存
*
*/
import java.net.*;
import java.io.*;
public class TcpClient
{
public static void main(String [] args)
{
try
{
//Socket s=new Socket(InetAddress.getByName("192.168.0.213"),8001);
if(args.length < 2)
{
System.out.println("Usage:java TcpClient ServerIP ServerPort");
return;
}
Socket s=new Socket(
InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
//InputStream ips=s.getInputStream();
//OutputStream ops=s.getOutputStream();
//DataInputStream dis= new DataInputStream(new BufferedInputStream(new FileInputStream("1.txt")));//在当前文件下实现
DataInputStream dis= new DataInputStream(new BufferedInputStream(new FileInputStream("d:/1.txt")));//在绝对路径中实现,
如d:/src/Dictionary.txt(or d:\\src\\Dictionary.txt
DataOutputStream dos= new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));//网络输出流。
byte buf[]=new byte[2048];
int i=0;
//while(int i=(dis.read(buf)!=-1))是错误的表达式
//write(buf,0,i)将数据以字节的形式输出到网络输出流,然后传递给server:TecServer.java:s.getInputStream()
while((i=dis.read(buf))!=-1)
{dos.write(buf,0,i); }
dos.flush(); //将缓冲区中的内容存入流中,如果没有此步,数据不会写入文件中
dos.close();
dis.close();
s.close();
}catch(Exception e){e.printStackTrace();}
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
本节继续研究网络编程
我们还是以TCP网络编程为例,下面的例子是实现从客服端传入一个文件,然后在服务器端接受并保存
/**
*程序2
*该程序是服务端程序
*该程序实现传送一个文件,接收并保存
**/
import java.net.*;
import java.io.*;
class Servicer implements Runnable
{
Socket s;
public Servicer(Socket s)
{
this.s = s;
}
public void run()
{
try
{
//InputStream ips=s.getInputStream();
//OutputStream ops=s.getOutputStream();
//getInputStream public InputStream getInputStream() throws IOException返回此套接字的输入流。
//public BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。创建一个内部缓
冲区数组并将其存储在 buf 中。
//public DataInputStream(InputStream in)使用指定的底层 InputStream 创建一个 DataInputStream。
//它们之间的关系是
//java.lang.Object
//java.io.InputStream
// java.io.FilterInputStream
// java.io.DataInputStream
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("new1.txt")));//在当前目录下建立文件
byte buf[]=new byte[2048];
int i=0;
while((i=dis.read(buf))!=-1)
{dos.write(buf,0,i); }//将内容写入到new1.txt文件中
dos.flush(); //将缓冲区中的内容存入流中,如果没有此步,数据不会写入文件
dos.close();
dis.close();
s.close();
}catch(Exception e){e.printStackTrace();}
}
}
class TcpServer
{
public static void main(String [] args)
{
try
{
ServerSocket ss=new ServerSocket(8001);//定义端口,8000、8001为通用接口
//ServerSocket ss=new ServerSocket(0);//获取当前接口
//int i=ss.getLocalPort();
System.out.println("sever 正在运行"+"端口号为:"+ss.getLocalPort());
while(true)
{
Socket s=ss.accept();
new Thread(new Servicer(s)).start();
}
//ss.close();
}catch(Exception e){e.printStackTrace();}
}
}
/*
*程序2可能存在的问题
*
(1)Connection reset by peer
执行 第三步的While循环可能产生连接关闭异常,
原因:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉,连接并发数由backlog控制,默认值为5。
backlog: 用于在TCP层接收链接的缓冲池的最大个数,这个个数可在应用层中的listen函数里设置,当客户链接请求大于这个个数(缓冲池满),其它的未
进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时(大约57秒后)
解决:1.增加Byte buf[]=new Byte[len];len的值,以减少连接次数,减少While循环的次数。
2 增加并发连接数的值,把serversocket的backlog设置为200。
(2)dos.flush()不调用此方法,刚数据会存在于缓冲区中,但不会写入文件或对应的流中。
*/
/**
*程序2
*该程序是客户端程序
*该程序实现传送一个文件,接收并保存
*
*/
import java.net.*;
import java.io.*;
public class TcpClient
{
public static void main(String [] args)
{
try
{
//Socket s=new Socket(InetAddress.getByName("192.168.0.213"),8001);
if(args.length < 2)
{
System.out.println("Usage:java TcpClient ServerIP ServerPort");
return;
}
Socket s=new Socket(
InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
//InputStream ips=s.getInputStream();
//OutputStream ops=s.getOutputStream();
//DataInputStream dis= new DataInputStream(new BufferedInputStream(new FileInputStream("1.txt")));//在当前文件下实现
DataInputStream dis= new DataInputStream(new BufferedInputStream(new FileInputStream("d:/1.txt")));//在绝对路径中实现,
如d:/src/Dictionary.txt(or d:\\src\\Dictionary.txt
DataOutputStream dos= new DataOutputStream(new BufferedOutputStream(s.getOutputStream()));//网络输出流。
byte buf[]=new byte[2048];
int i=0;
//while(int i=(dis.read(buf)!=-1))是错误的表达式
//write(buf,0,i)将数据以字节的形式输出到网络输出流,然后传递给server:TecServer.java:s.getInputStream()
while((i=dis.read(buf))!=-1)
{dos.write(buf,0,i); }
dos.flush(); //将缓冲区中的内容存入流中,如果没有此步,数据不会写入文件中
dos.close();
dis.close();
s.close();
}catch(Exception e){e.printStackTrace();}
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
相关文章推荐
- 嘿牛程序员__成都传智博客__包装类(二)
- 嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数
- 嘿牛程序员__成都传智博客__javascript的注册表单验证、提交问题
- 嘿牛程序员__成都传智博客__文件的拷贝:单个文件的拷贝(上)
- 嘿牛程序员__成都传智博客__文件的拷贝:单个文件的拷贝(下)
- 嘿牛程序员__成都传智博客__枚举的一个带参构造函数的实现——以交通灯的转换为例
- 嘿牛程序员__成都传智博客__枚举的一个带有case的普通实现——以星期的转换为例
- 嘿牛程序员__成都传智博客__文件的拷贝:实现整个文件夹的拷贝
- 嘿牛程序员__成都传智博客__可变参数举例
- 嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续一:通过数组实现按次序输出)
- 嘿牛程序员__成都传智博客__包装类(一)
- 嘿牛程序员__成都传智博客__JavaScript中的复选框的全选、反选问题
- 嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续一:通过数组实现按次序输出)
- 传智博客学习笔记15--JAVA网络编程
- 关于c#网络编程(scoket)转自子阳博客
- 黑马程序员_java中的网络编程
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
- 传智博客学习笔记4--JAVA编程基础1
- 黑马程序员_网络编程(1)