您的位置:首页 > 理论基础 > 计算机网络

Java学习笔记--网络编程Socket

2017-05-31 21:08 579 查看
**今天学习了网络编程,主要用到Socket语句。

1.首先了解网络编程三要素

a.ip:一个计算机的标识,是一个网络之间互联的协议(Internet Protocol),每个终端有且仅有一个ip地址。

b.端口:设备与外界进行通信的出口,用来进行通信,分为物理端口和逻辑端口,这里用到的端口是逻辑端口,

有效端口的范围在0~65535之间,是应用程序在计算机内部对应的表示。

c.协议:计算机网络中用于交换信息而规则,标准或约定的集合。这里指TCP/UDP。

2.TCP/UDP协议

TCP协议:是一种面向连接的,可靠的基于字节流的传输层通信协议,需要建立连接,形成连接通道,

数据可以使用连接通道直接进行传输,无大小限制,效率比较低

UDP协议:User Datagrem Protocol,用户数据包协议,一种无连接的传输层协议,和TCP协议相同用于处理数据包,

UDP有不提供数据包的分组,组装,还有对数据包进行排序的缺点,所以我们无法确定数据包是否被安全

传达。效率较TCP来说比较高,但是不安全。

3.学习中用到的Java类

InetAddress:IP地址描述类,为了方便我们对IP地址的获取和操作,常见功能有:

public static InerAddress getByName(String host);通过主机名或IP地址得到InetAdress类

public String getHostAddress();返会ip地址字符串

public String getHostName(); 返回ip地址主机名。

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
public static void main(String[] args) throws Exception {
InetAddress address = InetAddress.getByName("192.168.20.25");

String hostName = address.getHostName();
System.out.println(hostName);
}
}


4.Socket编程(网络编程)

a.Socket套接字具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

b.Socket编程机制:

通信双方都有Socket。

网络通信实际就是Socket间的通信。

数据在两个Socket之间进行IO传输。

c.UDP通信

发送步骤:创建UDP发送数据端的Socket对象;创建数据包并给出数据,把数据打包;通过Socket对象发送数据包;释放资源。

接收步骤:创建UDP接收端的Socket对象;创建一个接收数据的数据包;接收数据,将数据放在接收的数据
4000
包中;解析数据包,并把数据显示在控制台上;释放资源。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpClient {
public static void main(String[] args) throws Exception {
//1.创建发送端的socket对象
DatagramSocket ds = new DatagramSocket();

InetAddress address = InetAddress.getByName("192.168.20.25");
int port = 9999;

//2.创建键盘录入对象
Scanner sc = new Scanner(System.in);
String line;
while ((line=sc.nextLine())!=null) {
//键盘录入的数据line
byte[] buf = line.getBytes();
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length, address, port);
//发送数据包
ds.send(dp);
}

//释放资源
ds.close();
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
public static void main(String[] args) throws Exception {
//创建接收端的socket对象
DatagramSocket ds = new DatagramSocket(9999);

//接受来自客户端的数据
while (true) {
//创建数据包
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length);

//接受来自客户端的数据
ds.receive(dp);

//解析数据包中的数据
byte[] data = dp.getData();
int len = dp.getLength();
System.out.println(new String(data, 0, len));
}
}
}


d.TCP通信

发送端:创建TCP底层传输数据Socket对象(指定服务器ip及端口号),如Socket sk = new Socket(“196.168.25.25”,9999);获取输出流,并写入数据,如OutputStream outputStream = sk.getOutputStream();

outputStream.write(“Hello”.getBytes());

释放资源;

接收端:创建TCP协议接收端Socket对象(ServerSocket);监听客户端连接(Socket socket = new ServerSocket().accpet();获取输入流,并读取数据,显示在数据台;释放资源(socket.close())。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread implements Runnable{
private Socket sk;
public ServerThread(Socket sk){
this.sk = sk;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter(UUIDUtils.getFileName()));

String line;
while((line = br.readLine()) != null ){
bw.write(line);
bw.newLine();
bw.flush();
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.print````````
tackTrace();
}
}

}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
* 2.6
需求:客户端读取文本文件中的内容发送给服务端,服务端将内容控制台输出
*  客户端:
*  1.读取文本文件,一次读取一行
*  2.将读取到的内容写入通道,一次写一行
*  3.释放资源
*  服务器端:
*  1.从通道中读取数据,一次读取一行
*  2.输出
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
Socket sk = new Socket("192.168.20.25", 10010);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
BufferedReader br = new BufferedReader(new FileReader("a.txt"));

String line;
while((line = br.readLine()) != null ){
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
sk.close();
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10010);
while(true){
Socket sk = ss.accept();
new Thread(new ServerThread(sk)).start();
}

}
}
import java.util.UUID;

public class UUIDUtils {

public static String getFileName(){
String fileName = UUID.randomUUID().toString();
fileName = fileName.replaceAll("-", "") + ".txt";
return fileName;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: