资源描述
JAVA套接字(Socket)编程分析
班级:11计科6班 姓名:叶创建 学号:201141402601
一、TCP 套接字编程
功能:服务端启动后,客户端往服务端发送小写字母,服务端返回大写字母。
new Socket();
创建套接字对象
客户端
服务端
程序框图:
new SocketServer();
创建套接字服务
建立连接
创建输出流new OutputStreamWriter(),从键盘录入字母
accept();获得Socke对象,并监听客户端
new BufferedReader()获得输入流
new BufferedReader)
获得输入流,打印字母
toUpperCase()转换为大写字母
if 客户端发送OVER
close()关闭套接字
new PrintWriter()创建输出流,输出大写字母
if 客户端发送OVER
close()关闭套接字
TCP服务端程序代码:
class TransServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ssk = new ServerSocket(10001);//创建Socket服务
Socket sk = ssk.accept();//获取客户端Socket对象
String ip = sk.getInetAddress().getHostAddress();//获取客户端IP
System.out.println(ip+"is connected...");
BufferedReader bufIn=
new BufferedReader(new InputStreamReader(sk.getInputStream()));//获得输入流对象
PrintWriter out = new PrintWriter(sk.getOutputStream(),true);//获得输出流对象
String line =null;
while((line=bufIn.readLine())!=null)
{
System.out.println(line);
out.println(line.toUpperCase());//转换成小写
}
sk.close();
ssk.close();
}
}TCP客户端程序代码:
class TransClient
{
public static void main(String[] args) throws Exception
{
Socket sk = new Socket("localhost",10001);
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(sk.getInputStream()));
String line = null;
while((line=bufr.readLine())!=null)
{
if ("over".equals(line))//over结束对话
{
break;
}
System.out.println(line);
out.println(line);
String str = bufIn.readLine();
System.out.println("server:"+str);
}
bufr.close();
sk.close();
}
}
运行效果:
TCP套接字分析:
1. 对于服务端ServerSocket ssk = new ServerSocket(10001);创建Socket服务,接收端口为10001,这个端口必须是唯一的,范围在0~65535之间.
2. 客户端创建Socket服务,往服务端IP的10001端口发送数据;服务端调用ssk.accept();获取客户端的Socket对象,监听的端口为10001
3. 获取客户端发送的数据,即输入流.
4. 把字母转换后生成输出流,传回给客户端.
5. 最好关闭套接字对象.
6. 其中对于输入流和输出流,这些输入IO技术,因为传送的是字母,不是二进制文件,所以只需调用字符流对象即可.
7. 服务端只有一个,而客户端有多个,每一个客户端连接服务端的时候,服务端都会获得一个Socket对象,所以在程序池里面会有多个不同的Socket对象.
8. ssk.accept()是个阻塞方法,所以在编写程序的时候要特别注意,不能让服务端和客户端同时在等待.
9. 多个客户端连接服务端的时候需要排队,如需并发进行,需要运用java的多线程技术.
二、UDP套接字编程(UDP聊天室)
new DatagramSocket()创建套接字
接收端
发送端
程序框图:
new DatagramSocket(8085)创建套接字
new DatagramPacket()
创建包对象,指定监听端口
new DatagramPacket()
对数据进行打包,指定目的地IP和端口
ds.send(dp);发送包
ds.receive(dp);接受发送端数据
close()关闭套接字
if 客户端发送OVER
close()关闭套接字
程序代码:
import .*;
import java.io.*;
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds ;
}
public void run()
{
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=bufr.readLine())!=null )
{
byte[] buf = line.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),81);
ds.send(dp);
if("886".equals(line))
break;
}
}
catch (Exception e )
{
throw new RuntimeException("发送端失败");
}
}
}
class Rece implements Runnable
{
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String data = new String(dp.getData(),0 ,dp.getLength());
System.out.println(ip+":"+port+"-->>"+data);
}
}
catch (Exception e )
{
throw new RuntimeException("发送端失败");
}
}
}
class ChatDemo
{
public static void main(String[] args) throws Exception
{
new Thread(new Send(new DatagramSocket(8085))).start();
new Thread(new Rece(new DatagramSocket(81))).start();
}
}
运行效果
UDP套接字分析:
1. DatagramSocket()是java中创建UDP的Socket对象的构造方法,发送方调用该方法,指定程序的端口,用于识别程序.调用 DatagramPacket()对数据进行打包,指定目的地IP地址和接收端口,最后调用send()方法把包发送出去.
2. 接收方调用DatagramSocket(81)方法指定监听的端口,调用DatagramPacket()创建包,再调用ds.receive(dp)接收81端口发送过来的包.其中dp.getData()方法是获得包里面的数据,再打印在控制台上.
3. 发送端和接收端都用了while循环,不断接不断收.再调用java 的多线程技术使两个程序能过并发进行.
4. 该UDP聊天室只能在本地进行收发,如果需要改成局域网的聊天室,则只需要把发送端程序的目的IP改为广播地址,广播地址一般为网段后在最后一个IP.
展开阅读全文