一、TCP
server
/*
Tcp协议
|--建立连接,形成传输数据的通道
|--在连接中进行大量数据传输
|--通过三次握手完成连接,是可靠协议
|--必须建立连接,效率稍低
*/
import java.io.*;
import java.net.*;
class TcpServer
{
public static void main(String[] args) throws Exception
{
System.out.println("server start!");
//建立服务端 监听10005端口
ServerSocket ss = new ServerSocket(10005);
//连接客户端 得到客户端对像
Socket s = ss.accept();
//用缓冲流来装饰客户端的输入流
BufferedReader br = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
//BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( s.getOutputStream() ) );
//用PrintWriter 来装饰客户端的输出流 以便格式化输出
PrintWriter outbuf = new PrintWriter(s.getOutputStream(),true);
String line = null;
while(( line = br.readLine() ) != null)
{
//在服务端显出客户端发来的数据
System.out.println(line);
//将客户端发来的数据转成大写 返回给客户端
outbuf.println(line.toUpperCase());
}
//关闭资源
br.close();
outbuf.close();
ss.close();
}
}
client
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
System.out.println("Client statr!");
//以10005端口建立客户端 并连接本地主机
Socket s = new Socket(InetAddress.getLocalHost().getHostAddress(),10005);
//以建盘录入来做为数据的输入
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
//用PrintWriter 来装饰输出数据流 以便格式化的发给服务端
PrintWriter outbuf = new PrintWriter(s.getOutputStream(),true);
//用缓冲流来装饰来自服务端返回的 输入数据流
BufferedReader inbuf = new BufferedReader( new InputStreamReader( s.getInputStream()));
String line;
while(!((line = br.readLine()).equals("over")))
{
//向服务端发送数据
outbuf.println(line);
//显示服务端返回的数据
System.out.println( inbuf.readLine());
}
//关闭资源
br.close();
outbuf.close();
inbuf.close();
s.close();
}
}
二、UDP
send
/*
UDP协议
|--将数据及源和目地封装成在数据包中,不需要建立连接
|--每个数据的大小限制在64k内
|--因为是无连接,是不可靠协议
|--不需要建立连接,速度快
*/
import java.net.*;
import java.io.*;
class UdpSend
{
public static void main(String[] args) throws Exception
{
//1.创建udp socket,建立端点.
DatagramSocket ds = new DatagramSocket(8888);
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
//2.定义数据包,用于存储数据.
String line=null;
while((line=read.readLine())!=null)
{
if("xiao".equals(line))
break;
byte[] buf =line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),10000);
//通过socket 服务,将已有的数据包发送出去。
ds.send(dp);
}
//关闭资源
ds.close();
}
}
receive
import java.net.*;
class UdpReceive
{
public static void main(String[] args) throws Exception
{
//1.创建udp socket ,建立端点.
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
//2.定义数据包, 用于存储数据.
byte [] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3.通过服务的receive方法将收到的数据存入数据包中。
ds.receive(dp);
//4.通过数据包的方法获取其中的数据.
InetAddress inet = dp.getAddress();
String ip = inet.getHostAddress();
String name = inet.getHostName();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println("主机名:"+name);
System.out.println("IP地址:"+ip);
System.out.println("端口号:"+port);
System.out.println("数据:"+data);
}
//5.关闭资源
// ds.close();
}
}