关闭

黑马程序员——Java基础--网络编程

标签: 博客黑马程序员网络编程javaandroid
361人阅读 评论(0) 收藏 举报
分类:

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

网络编程
一、概述
        网络编程简单的说就是实现了多个计算机互联的系统,我们可以通过网络进行交换数据,而实现这一原理我们要编写网络应用程序,编写之前我们得了解网络程序所要使用的网络协议,TCP/IP是我们首先考虑到的协议,当然计算机网络有两种参考模型:

当然,要实现这一原理,我们还得知道网络通信的三要素:
1、IP地址:InetAddress,网络中设备的标识,不易记忆,可用主机名表示,两者存在映射关系,本机回环地址:127.0.0.1,主机名为:localhost。
2、端口号:
用于标识进程的逻辑地址,不用进程的标识。有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024
3、传输协议:
即通信规则,包含TCPUDP协议

TCP 是面向连接的,必须连接成功才能传输数据,应用于下载等程序上,

其特点:

         a、面向连接,在建立连接后,形成传输数据的通道;

         b、在连接中进行大数据量的传输;

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

         d、必须建立连接,效率稍慢。

UDP是面向无连接,明确了对方的端口,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中。

其特点:

         a、面向无连接,即将数据及源和目的封装成数据包中,不建立链接的发送;

         b、每个数据包的大小限制在64K之内;

         c、因无连接,是不可靠的协议;

         d、不建立连接,速度快。

二、Socket编程

        1、它被称之为插座,相当于港口一样,是网络服务提供的一种机制。

        2、通信两端都要有Socket,才能建立服务。

        3、网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

三、TCP小程序
使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
服务器
package com.itheima;
/*
 * 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
	服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
	分析:
		先打开服务器端,在打开客户端进行输入,在反转发回给客户端
*/
import java.net.*;
import java.io.*;
// 服务器
class Test10_1{
	public static void main(String[] args) {
		try{
			ServerSocket ss = new ServerSocket(6666);//创建对象,给定端口号
			Socket socket = ss.accept();//接收客户端的连接
			System.out.println("连接成功..等待Client输入..");
			InputStream in = socket.getInputStream();//获取输入流
			OutputStream out = socket.getOutputStream();//获取输出流
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);
			String s = null;
			if ((s = dis.readUTF()) != null){
				System.out.println("Client : " + s);
				//创建StringBuilder对象
				StringBuilder sb = new StringBuilder(s);//将接收客户端的字符串为初始化内容									
				StringBuilder s2 = sb.reverse();//字符串反转
				String s3 = s2.toString();
				dos.writeUTF(s3);// 写入方法
			}
			dis.close();
			dos.close();
			ss.close();
		} catch(IOException e) {//捕获异常
			e.printStackTrace();
		}		
	}
}
客户端
package com.itheima;
/*
 * 使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。
	服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
	分析:
		先打开服务器端,在打开客户端进行输入,在反转发回给客户端
*/
import java.net.*;
import java.util.*;
import java.io.*;
// 客户端类
class Test10_2{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		try{
			Socket socket = new Socket("127.0.0.1",6666);//创建Socket对象,连接到指定IP地址和端口
			InputStream in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();
			DataInputStream dis = new DataInputStream(in);
			DataOutputStream dos = new DataOutputStream(out);
			String s = null;
			System.out.println("请输入字符串..");
			String s2 = sc.next();//接收键盘录入
			dos.writeUTF(s2);
			dos.flush();
			if ((s = dis.readUTF()) != null){
				System.out.println("Server : " + s);
			}
			dos.close();
			dis.close();
			socket.close();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}
四、UDP小程序
package cn.itheima.xieyi;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/* 
	编写一个聊天程序。 
	有收数据的部分,和发数据的部分。 
	这两部分需要同时执行。 
	那就需要用到多线程技术。 
	一个线程控制收,一个线程控制发。 
	因为收和发动作是不一致的所以要定义两个run方法
	而且这个两个方法要封装到不同的类中。
*/
//UDP发送线程
class UdpSend implements Runnable{
	//定义Socket服务引用
	private DatagramSocket ds;
	UdpSend(DatagramSocket ds){
		this.ds = ds;
	}
	//复写run方法
	public void run(){
		try{
			//确定数据,从键盘录入,并把键盘录入的数据封装成数据包
			DatagramPacket dp=null;
			BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
			String line=null;
			while((line=br.readLine())!=null){
				byte[] buf=line.getBytes();
				dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10000);
				//通过Socket服务,将已有的数据包发送出去
				ds.send(dp);
				if ("886".equals(line)){
					break;
				}
			}
			//释放资源
			ds.close();
		}catch (Exception e) {
			throw new RuntimeException("发送数据失败");
		}
	}
}
//Udp接收线程
class UdpReceive implements Runnable{
	//定义Socket服务引用
	private DatagramSocket ds;
	UdpReceive(DatagramSocket ds){
		this.ds = ds;
	}
	//复写run方法
	public void run() {
		try{
			//一直处于接收状态
			while (true){
				//定义数据包,用于存储数据
				byte[] buf=new byte[1024];
				DatagramPacket dp=new DatagramPacket(buf,buf.length);
				//通过Socket服务,将数据接收并存储进数据包中
				ds.receive(dp);
				//通过数据包的方法获取其中的数据
				String ip=dp.getAddress().getHostAddress();
				String data=new String(dp.getData(),0,dp.getLength());
				int port=dp.getPort();
				System.out.println("IP:"+ip+"=="+data);
			}
			//释放资源
		}catch(Exception e){
			throw new RuntimeException("接收端接收数据失败");
		}
	}
}
public class Test_3 {
	public static void main(String[] args) throws SocketException {
		new Thread(new UdpSend(new DatagramSocket())).start();
		new Thread(new UdpReceive(new DatagramSocket(10000))).start();
	}
}

-----------android培训java培训、java学习型技术博客、期待与您交流!------------



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6111次
    • 积分:308
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档