-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
网络编程
一、概述
网络编程 ,简单的说就是实现了多个计算机互联的系统,我们可以通过网络进行交换数据,而实现这一原理我们要编写网络应用程序,编写之前我们得了解网络程序所要使用的网络协议,TCP/IP是我们首先考虑到的协议,当然计算机网络有两种参考模型:
网络编程 ,简单的说就是实现了多个计算机互联的系统,我们可以通过网络进行交换数据,而实现这一原理我们要编写网络应用程序,编写之前我们得了解网络程序所要使用的网络协议,TCP/IP是我们首先考虑到的协议,当然计算机网络有两种参考模型:
当然,要实现这一原理,我们还得知道网络通信的三要素:
1、IP地址:InetAddress,网络中设备的标识, 不易记忆,可用主机名表示,两者存在映射关系 ,本机回环地址: 127.0.0.1 ,主机名为: localhost。
2、端口号: 用于标识进程的逻辑地址,不用进程的标识。 有效端口: 0 ~65535 ,系统使用或保留的端口是: 0~ 1024 。
3、传输协议: 即通信规则,包含 TCP 和 UDP 协议 。
使用TCP协议完成一个客户端一个服务器。客户端从键盘输入读取一个字符串,发送到服务器。服务器接收客户端发送的字符串,反转之后发回客户端。客户端接收并打印。
服务器
1、IP地址:InetAddress,网络中设备的标识, 不易记忆,可用主机名表示,两者存在映射关系 ,本机回环地址: 127.0.0.1 ,主机名为: localhost。
2、端口号: 用于标识进程的逻辑地址,不用进程的标识。 有效端口: 0 ~65535 ,系统使用或保留的端口是: 0~ 1024 。
3、传输协议: 即通信规则,包含 TCP 和 UDP 协议 。
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();
}
}