黑马程序员—java基础—网络编程_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 黑马程序员—java基础—网络编程

黑马程序员—java基础—网络编程

 2011/10/31 8:29:27  baiqian  http://baiqian.iteye.com  我要评论(0)
  • 摘要:----------------------android培训、java培训、期待与您交流!----------------------网络编程:网络通讯要素:IP地址(InetAddress对象),端口号,传输协议(常用的是TCP、UDP)。UDP:(聊天、网络视频会议……就是采用UDP,数据不重要只求速度快)将数据及源和目的封装成数据包中,不需要建立连接每个数据报的大小在限制在64K内因是无连接的,所以是不可靠协议不需要连接,速度快TCP:建立连接
  • 标签:程序 程序员 Java 网络 编程

---------------------- android培训java培训、期待与您交流! ----------------------

?

?

网络编程:

网络通讯要素:

IP地址(InetAddress对象),端口号,传输协议(常用的是TCPUDP)

UDP:(聊天、网络视频会议……就是采用UDP,数据不重要只求速度快)

将数据及源和目的封装成数据包中,不需要建立连接

每个数据报的大小在限制64K

因是无连接的,所以是不可靠协议

不需要连接,速度快

TCP:

建立连接,形成传输数据的通道

在连接中进行大数据量传输

通过三次握手完成连接,是可靠协议

必须建立连接,效率会稍低

Socket:

它是为网络服务提供的一种机制,

网络的两端都要有Socket

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

UDP:

创建发送UDP的流程:

1、建立UDPSocket服务通过DatagramSocket对象

2、提供数据,并将数据封装到数据包中

DatagramPacket(byte[]?buf,int?length,InetAddress?address,int?port)

3、通过Socket服务的发送功能,将数据发送出去通过send()方法

4、关闭资源。close()方法

创建接收UDP的流程:

1、定义UDPSocket服务通过DatagramSocket对象

通常会监听一个端口。其实就是给这个接收网络应用程序定义数据标识。

2、定义一个数据包(DatagramPacket(byte[]?buf,int?length)

3、通过socket服务的receive()方法将收到的数据存入已定义好的数据包中

4、通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上

5、关闭资源

Socket线程结合就能完成聊天小程序。

TCP:

TCP传输采用Socket(客户端对象)ServerSocket服务端对象)

Socket:

1、创建客户端的Socket服务,指定目的主机的端口

Socket?socket=new?Socket("172.18.70.136",8888);

2、为了发送数据,应该获取socket流中的输出流

OutputStream?out=socket.getOutputStream();

ServerSocket端:

1、创建服务器端的Socket服务,并监听一个端口。ServerSocket();

2、获取连接过来的客户端对象,通过ServerSocketaccept方法,没有连接就会等,这个方法是阻塞式的。

3、客户端如果发过来数据,服务端要使用对应的客户端对象?,并获取到该客户端对象的读取流来该读取发过来的数据,并打印在控制台。

4、关闭服务端(可选)

?

例子出现的问题解析

?

public class TransClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket=new Socket("172.18.70.136",10000);
		//键盘输入数据信息
		BufferedReader keyIn=
			new BufferedReader(new InputStreamReader(System.in));
		//发向服务器端的输出流
		BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		//接收从服务器端过来的输入流
		BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		/**
		 * 这里可以将bufferedReader替换成PrintWriter可以省去了newLine()和flush();
		 * PrintWriter in=new PrintWriter(new InputStreamWriter(socket.getInputStream()));
		 */
		String line=null;
		while((line=keyIn.readLine())!=null){
			if("886".equals(line)){
				break;
			}
			out.write(line);
			//不能少了回车和刷新
			out.newLine();
			out.flush();
			String message=in.readLine();
			System.out.println("服务器说:"+message);
			
		}
		
		keyIn.close();
		socket.close();
		
	}
}
public class TransServer {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket=new ServerSocket(10000);
		Socket socket=serverSocket.accept();
		String ip=socket.getInetAddress().getHostAddress();
		System.out.println(ip);
		//从客户端接收过来的输入流
		BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//发向客户端的输出流
		BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		
		String line=null;
		while((line=in.readLine())!=null){
			out.write(line.toUpperCase());
			out.newLine();
			out.flush();
			//String message=in.readLine();
		}
		socket.close();
		serverSocket.close();
	}
}

?

?

1、因为客户端和服务端都有阻塞式方法,方法没有读到结束标记就一直等

2、因为数据接收到后都在缓冲区,所以要刷新才能真正的写出来,必须flush();

??只要用到缓冲区就要记得刷新。bufferWriter.flush();

?

上传图片例子:

?

public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s=new Socket("172.18.70.136",10003);
		OutputStream os=s.getOutputStream();
		
		FileInputStream fis=new FileInputStream("20111026214905.png");
		int len=0;
		byte[] data=new byte[1024];
		while((len=fis.read(data))!=-1){
			os.write(data, 0, len);
		}
		s.shutdownOutput();
		
		InputStream is=s.getInputStream();
		byte[] num=new byte[1024];
		int lens=is.read(num);
		System.out.println(new String(num,0,lens));
		
		fis.close();
		s.close();
	}
}

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket ss=new ServerSocket(10003);
		Socket s=ss.accept();
		InputStream is=s.getInputStream();
		
		FileOutputStream fos=new FileOutputStream("1.png");
		byte[] data=new byte[1024];
		int len=0;
		while((len=is.read(data))!=-1){
			fos.write(data, 0, len);
		}
		
		OutputStream os=s.getOutputStream();
		os.write("上传成功!".getBytes());
		
		fos.close();
		s.close();
		ss.close();
	}
}

?

?

---------------------- android培训java培训、期待与您交流! ----------------------

发表评论
用户名: 匿名