JavaEE学习之网络编程Socket

来源:互联网 发布:网络分流器怎么连接图 编辑:程序博客网 时间:2024/05/29 16:00

l IP地址:用来唯一表示我们自己的电脑的,是一个网络标示

端口号: 用来区别当前电脑中的应用程序的

l UDP: 传送速度快,但是容易丢数据,如视频聊天,语音聊天

l TCP: 传送稳定,不会丢失数据,如文件的上传、下载

l UDP程序交互的流程

l 发送端

1,创建DatagramSocket对象

2,创建DatagramPacket对象,并封装数据

3,发送数据

4,释放流资源

l 接收端

1,创建DatagramSocket对象

2,创建DatagramPacket对象

3,接收数据存储到DatagramPacket对象中

4,获取DatagramPacket对象的内容

 5,释放流资源

l TCP程序交互的流程

l 客户端

1,创建客户端的Socket对象

2,获取Socket的输出流对象

3,写数据给服务器

4,获取Socket的输入流对象

5,使用输入流,读反馈信息

6,关闭流资源

l 服务器端

1,创建服务器端ServerSocket对象,指定服务器端端口号

2,开启服务器,等待着客户端Socket对象的连接,如有客户端连接,返回客户端的Socket对象

3,通过客户端的Socket对象,获取客户端的输入流,为了实现获取客户端发来的数据

4,通过客户端的输入流,获取流中的数据

5,通过客户端的Socket对象,获取客户端的输出流,为了实现给客户端反馈信息

6,通过客户端的输出流,写数据到流中

7,关闭流资源


/*

* 发送端

 * 1,创建DatagramSocket对象

 * 2,创建DatagramPacket对象,并封装数据

 * 3,发送数据

 * 4,释放流资源

 */

public class UDPSend {

public static void main(String[] args) throws IOException {

//1,创建DatagramSocket对象

DatagramSocket sendSocket = new DatagramSocket();

//2,创建DatagramPacket对象,并封装数据

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

//构造数据报包,用来将长度为length 的包发送到指定主机上的指定端口号。

byte[] buffer ="hello,UDP".getBytes();

DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("192.168.75.58"), 12306);

//3,发送数据

//public void send(DatagramPacket p)从此套接字发送数据报包

sendSocket.send(dp);

//4,释放流资源

sendSocket.close();

}

}

 

l UDP完成数据的接收

/*

 * UDP接收端

 *

 * 1,创建DatagramSocket对象

 * 2,创建DatagramPacket对象

 * 3,接收数据存储到DatagramPacket对象中

 * 4,获取DatagramPacket对象的内容

 * 5,释放流资源

 */

public class UDPReceive {

public static void main(String[]args)throws IOException {

//1,创建DatagramSocket对象,并指定端口号

DatagramSocket receiveSocket =new DatagramSocket(12306);

//2,创建DatagramPacket对象,创建一个空的仓库

byte[]buffer =new byte[1024];

DatagramPacket dp =new DatagramPacket(buffer, 1024);

//3,接收数据存储到DatagramPacket对象中

receiveSocket.receive(dp);

//4,获取DatagramPacket对象的内容

//谁发来的数据  getAddress()

InetAddress ipAddress =dp.getAddress();

String ip =ipAddress.getHostAddress();//获取到了IP地址

//发来了什么数据  getData()

byte[]data =dp.getData();

//发来了多少数据getLenth()

int length =dp.getLength();

//显示收到的数据

String dataStr =new String(data,0,length);

System.out.println("IP地址:"+ip+"数据是"+dataStr);

//5,释放流资源

receiveSocket.close();

}

}





/*

 * TCP 服务器端

 *

 * 1,创建服务器ServerSocket对象(指定服务器端口号)

 * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

 * 3,给客户端反馈信息

 * 4,关闭流资源

 */

public class TCPServer {

public static void main(String[] args) throws IOException {

//1,创建服务器ServerSocket对象(指定服务器端口号)

ServerSocket ss = new ServerSocket(8888);

//2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

Socket s = ss.accept();

//3,给客户端反馈信息

/*

 * a,获取客户端的输出流

 * b,在服务端端,通过客户端的输出流写数据给客户端

 */

//a,获取客户端的输出流

OutputStream out = s.getOutputStream();

//b,在服务端端,通过客户端的输出流写数据给客户端

out.write("你已经连接上了服务器".getBytes());

//4,关闭流资源

out.close();

s.close();

//ss.close();  服务器流 通常都是不关闭的

}

}

 

完成了服务器端程序的编写,接下来编写客户端程序。

/*

 * TCP 客户端

 *

 * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

 * 2,获取服务器端的反馈回来的信息

 * 3,关闭流资源

 */

public class TCPClient {

public static void main(String[] args) throws IOException {

//1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)

Socket s = new Socket("192.168.74.58", 8888);

//2,获取服务器端的反馈回来的信息

InputStream in = s.getInputStream();

//获取获取流中的数据

byte[] buffer =new byte[1024];

//把流中的数据存储到数组中,并记录读取字节的个数

int length = in.read(buffer);

//显示数据

System.out.println(new String(buffer, 0 , length) );

//3,关闭流资源

in.close();

s.close();

}

}



原创粉丝点击