JAVA的Socket

Socket编程步骤


基于TCP的Socket编程步骤:

  
1)服务器程序编写:
    ①调用ServerSocket(int port)创建一个服务器端套接字,并绑定到指定端口上;
       ServerSocket server = new ServerSocket(port);
    ②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字;
       Socket  socket = server.accept(); 
    ③调用Socket类的getInputStream获取输入流,开始网络数据的接收;
       InputStream in = socket.getInputStream();
    ④最后关闭通信套接字。
       socket.close();


2)客户端程序编写:
    ①调用Socket()创建一个流套接字,并连接到服务器端; 
      Socket socket = new Socket(ip, port);
    ②调用Socket类的getOutputStream()获取输出流,开始网络数据的发送;
      OutputStream out = socket.getOutputStream();  
    ③调用flush方法强制把缓存中的输出流输出(并清空缓存区),确保数据的发送;
      out.flush();
    ④最后关闭通信套接字
      socket.close();
--------------------------------------------------------------------------------------------------
服务器例子:


package t;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class server {
  public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(8888);
Socket s=ss.accept();
InputStream is=s.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String str;
while((str=br.readLine())!=null) {
 System.out.println(str);
}
br.close();
isr.close();
is.close();
s.close();
ss.close();
  }
}


客户端例子:
//127.0.0.1是回送IP地址,测试用,指自己的主机。


package t;


import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class user {
  public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("127.0.0.1",8888);
OutputStream os=s.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
PrintWriter pw=new PrintWriter(osw);
pw.println("hang1");
pw.println("hang2");
pw.flush();
pw.close();
osw.close();
os.close();
s.close();
  }
}


先运行服务器例子,后运行客户端例子,然后在控制台输出:

hang1   

hang2



--------------------------------------------------------------------------------------------------






 
基于UDP的Socket编程步骤:


1)接收端程序编写:
    ①调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上;
    ②调用DatagramPacket(byte[] buf, int length),建立一个字节数组以接收UDP包 ;
    ③调用DatagramSocket类的receive(),接收UDP包;
    ④最后关闭数据报套接字。
2)发送端程序编写:
    ①调用DatagramSocket()创建一个数据报套接字; 
    ②调用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port),建立要发送的UDP包;
    ③调用DatagramSocket类的send(),发送UDP包;
    ④最后关闭数据报套接字。

JAVA语言实现网络聊天import java.io.*; import java.net.*; import java.util.*; public class ChatHandler implements Runnable { protected Socket socket; protected ObjectInputStream dataIn; protected ObjectOutputStream dataOut; protected Thread listener; protected static Vector handlers = new Vector(); private boolean keepListening = true; public ChatHandler(Socket socket) { this.socket = socket; } public synchronized void start() { if (listener == null) { try { dataIn = new ObjectInputStream(socket.getInputStream()); dataOut = new ObjectOutputStream(socket.getOutputStream()); listener = new Thread(this); listener.start(); } catch (IOException ioException) { ioException.printStackTrace(); } } } public synchronized void stop() { if (listener != null) { try { if (listener != Thread.currentThread()) listener.interrupt(); listener = null; dataOut.close(); socket.close(); } catch (IOException ignored) { } } } public void run() { String message = ""; try { handlers.addElement(this); while (keepListening) { message = (String) dataIn.readObject(); if (message.equals("DISCONNECT")) { dataOut.writeObject(message); dataOut.flush(); stopListening(); } else broadcast(message); } } catch (ClassNotFoundException classNotFoundException) { } catch (EOFException ignored) { } catch (IOException ex) { if (listener == Thread.currentThread()) ex.printStackTrace(); } finally { handlers.removeElement(this); } try { dataIn.close(); } catch (IOException ioException) { ioException.printStackTrace(); } stop(); } protected void broadcast(String message) { synchronized (handlers) { Enumeration enumer = handlers.elements(); while (enumer.hasMoreElements()) { ChatHandler handler = (ChatHandler) enumer.nextElement(); try { handler.dataOut.writeObject(message); handler.dataOut.flush(); } catch (IOException ex) { handler.stop(); } } } } public void stopListening() { keepListening = false; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值