链接:http://blog.fondme.cn:8000/apidoc/jdk-1.8-google/
//获取本机IP和计算机名
System.out.println(InetAddress.getLocalHost().getHostAddress());
System.out.println(InetAddress.getLocalHost().getHostName());
//获取远程IP地址,通过Name
System.out.println(InetAddress.getByName("www.baidu.com").getHostAddress());
System.out.println(InetAddress.getByName("www.jd.com").getHostAddress());
Socket就是为网络服务提供的一种机制。通信的两端都有Socket,一个网络服务端点。网络通信其实就是Socket之间的通讯。而数据在两个Socket之间通过IO传输。
步骤:
//1,udpsocket服务。使用DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);
//2,将要发送的数据封装到数据包中。
String str = "udp传输演示:哥们来了!";
//使用DatagramPacket将数据封装到的该对象包中。
byte[] buf = str.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000);
//3,通过udp的socket服务将数据包发送出去。使用send方法。
ds.send(dp);
//4,关闭资源。
ds.close();
步骤:
//1,建立udp socket服务。
DatagramSocket ds = new DatagramSocket(10000);
//2,创建数据包。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3,使用接收方法将数据存储到数据包中。
ds.receive(dp);//阻塞式的。
//4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+text);
//5,关闭资源。
ds.close();
客户端发送数据到服务端的步骤:
服务端接收数据的步骤:
用一个例子来对步骤进行说明:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ConvertClientOfTCP {
/**
* 建立客户端
* 将键盘录入信息输入到客户端输出流
* 接收客户端返回的数据到控制台
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//建立客户端
Socket client = new Socket("localhost",22222);
//新建流
PrintStream printOut = new PrintStream(client.getOutputStream());
BufferedReader buffKey = new BufferedReader(new InputStreamReader(System.in));//键盘录入
BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
//开始操作
String line = null;
while((line = buffKey.readLine())!=null){
if(line.equals("over")) break;
printOut.println(line);
System.out.println(buffIn.readLine());//注意点
}
client.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ConvertServerOfTCP {
/**
* 接收客户端发来的数据
* 将数据显示在自己的控制台并转换为大写发送回客户端
* 关闭资源
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//建立服务器
ServerSocket server = new ServerSocket(22222);
//接收客户端
Socket client = server.accept();
String clientIP = client.getInetAddress().getHostAddress();
System.out.println(clientIP+"已登入");
//新建输入流:从字节流到字符流
BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
//新建输出流:从字符流转回字节流发给客户端,用printStream
PrintStream printOut = new PrintStream(client.getOutputStream(), true);
//开始操作
String line = null;
while((line = buffIn.readLine())!=null){
//先打印到自己屏幕
System.out.println(line);
//输出到客户端
printOut.println(line.toUpperCase());
}
System.out.println("服务端已结束");
//关闭资源
}
}
上面的例子是单客户端模式的样子,那么多客户端该怎么实现?这时就要使用多线程来实现。以下是修改后的实例:
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ConvertServerOfTCP {
/**
* 接收客户端发来的数据
* 将数据显示在自己的控制台并转换为大写发送回客户端
* 关闭资源
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//建立服务器
ServerSocket server = new ServerSocket(22222);
while (true) {
//接收客户端
Socket client = server.accept();
//新建线程
new Thread(new Converter(client)).start();
}
}
}
class Converter implements Runnable{
private final Socket client;
public Converter(Socket client){
this.client = client;
}
@Override
public void run() {
try {
converty(client);
} catch (IOException e) {
e.printStackTrace();
}
}
private void converty(Socket client) throws IOException {
String clientIP = client.getInetAddress().getHostAddress();
System.out.println(clientIP+"已登入");
//新建输入流:从字节流到字符流
BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
//新建输出流:从字符流转回字节流发给客户端,用printStream
PrintStream printOut = new PrintStream(client.getOutputStream(), true);
//开始操作
String line = null;
while((line = buffIn.readLine())!=null){
//先打印到自己屏幕
System.out.println(line);
//输出到客户端
printOut.println(line.toUpperCase());
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class ConvertClientOfTCP {
/**
* 建立客户端
* 将键盘录入信息输入到客户端输出流
* 接收客户端返回的数据到控制台
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//建立客户端
Socket client = new Socket("localhost",22222);
//新建流
PrintStream printOut = new PrintStream(client.getOutputStream());
BufferedReader buffKey = new BufferedReader(new InputStreamReader(System.in));//键盘录入
BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
//开始操作
String line = null;
while((line = buffKey.readLine())!=null){
if(line.equals("over")) break;
printOut.println(line);
System.out.println(buffIn.readLine());//注意点
}
client.close();
}
}