127.0.0.1
:是回送地址,可以代表本机地址,一般用来测试使用
InetAddress
static InetAddress getByName(String host)
//确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName() //获取此IP地址的主机名
String getHostAddress() //返回文本显示中的IP地址字符串
代码演示:
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//InetAddress address = InetAddress.getByName("itheima");
InetAddress address = InetAddress.getByName("192.168.1.66");
//public String getHostName():获取此IP地址的主机名
String name = address.getHostName();
//public String getHostAddress():返回文本显示中的IP地址字符串
String ip = address.getHostAddress();
System.out.println("主机名:" + name);
System.out.println("IP地址:" + ip);
}
}
UDP通信程序
Java提供了DatagramSocket类作为基于UDP协议的Socket
//创建数据报套接字并将其绑定到本机地址上的任何可用端口
DatagramSocket()
//创建数据包,发送长度为len的数据包到指定主机的指定端口
DatagramPacket(byte[] buf,int len,InetAddressadd,int port)
DatagramSocket相关方法:
void send(DatagramPacket p)// 发送数据报包
void close()// 关闭数据报套接字
void receive(DatagramPacket p) //从此套接字接受数据报包
发送数据的步骤
/* UDP发送数据: 数据来自于键盘录入,直到输入的数据是886,发送数据结束 */
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//自己封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null) {
//输入的数据是886,发送数据结束
if ("886".equals(line)) {
break;
}
//创建数据,并把数据打包
byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.66"), 12345);
//调用DatagramSocket对象的方法发送数据
ds.send(dp);
}
//关闭发送端
ds.close();
}
}
/* UDP接收数据: 因为接收端不知道发送端什么时候停止发送,故采用死循环接收 */
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket(12345);
while (true) {
//创建一个数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//解析数据包,并把数据在控制台显示
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}
//关闭接收端
// ds.close();
}
}
TCP发送消息
Java
对基于
TCP
协议的的网络提供了良好的封装,使用
Socket
对象来代表两端的通信端口,并通过 Socket产生
IO
流来进行网络通信。
Java
为客户端提供了
Socket
类,为服务器端提供了
ServerSocket
类
Socket(InetAddress address,int port)// 创建流套接字并将其连接到指定IP指定端口号
Socket(String host, int port) //创建流套接字并将其连接到指定主机上的指定端口号
相关方法
InputStream getInputStream() //返回此套接字的输入流
OutputStream getOutputStream() //返回此套接字的输出流
客户端:
public class ClientDemo {
public static void main(String[] args) throws IOException {
/*创建客户端的Socket对象(Socket) //Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号 */
Socket s = new Socket("192.168.1.66",10000);
//获取输出流,写数据 OutputStream getOutputStream() 返回此套接字的输出流
OutputStream os = s.getOutputStream();
os.write("hello,tcp,我来了".getBytes());
//释放资源
s.close();
}
}
服务端:
相关方法
ServletSocket(int port) //创建绑定到指定端口的服务器套接字
Socket accept() //监听要连接到此的套接字并接受它
示例:
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象(ServerSocket)
ServerSocket ss = new ServerSocket(10000);
//监听客户端连接,返回一个Socket对象
Socket s = ss.accept();
//获取输入流,读数据,并把数据显示在控制台
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys, 0, len);
System.out.println("服务器:" + data);
//给出反馈
OutputStream os = s.getOutputStream();
os.write("数据已经收到".getBytes());
//释放资源
// s.close();
ss.close();
}
}
解决下客户端和服务器端互相等待对方传输数据的尴尬情况
void shutdownInput() //将此套接字的输入流放置在“流的末尾”,
void shutdownOutput() //禁止用此套接字的输出流,告诉连接的另一方输出结束
多线程:
public class ServerThread implements Runnable {
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
//接收数据写到文本文件
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//解决名称冲突问题
int count = 0;
File file = new File("myNet\\Copy["+count+"].java");
while (file.exists()) {
count++;
file = new File("myNet\\Copy["+count+"].java");
}
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
String line;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//给出反馈
BufferedWriter bwServer = new BufferedWriter(new
OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();
//释放资源
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务器Socket对象
ServerSocket ss = new ServerSocket(10000);
while (true) {
//监听客户端连接,返回一个对应的Socket对象
Socket s = ss.accept();
//为每一个客户端开启一个线程
new Thread(new ServerThread(s)).start();
}
}
}