黑马程序员 java socket用tcp与udp实现

 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


只强调一点:

(1) Datagram Sockets:数据包socket,一般传输方式为UDP

(2) Stream Sockets:流socket,一般传输方式为TCP

Java通过两个类DatagramSocket和DatagramPacket来支持但Datagram socket(UDP)。Datagram Socket不真正区分Server和Client,既可以用来写server,也可以写client。但对于java中的Socket类和ServerSocket类就只能分别来写客户端和服务器端(同时支持TCP与UDP,更Socket(String host,int port,boolean stream)构造方法中的stream即可)。


Socket与TCP、UDP

1、TCP实现

package myjava.net.socket.tcp;


import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;


public class SocketTCP extends Thread {

private Socket s;


public SocketTCP(Socket s) {

this.s = s;

}


@Override

public void run() {

try {

OutputStream os = s.getOutputStream();

InputStream is = s.getInputStream();

os.write("Hello,welcome you!".getBytes());

byte[] buf = new byte[100];

int len = is.read(buf);

System.out.println(new String(buf, 0, len));

os.close();

is.close();

s.close();

} catch (Exception e) {

e.printStackTrace();

}

}


public static void main(String[] args) {

if (args.length > 0)

server();

else

client();

}


public static void server() {

try {

ServerSocket ss = new ServerSocket(6000);

while (true) {

Socket s = ss.accept();

new SocketTCP(s).start();

}


// ss.close();

} catch (IOException e) {

e.printStackTrace();

}

}


public static void client() {

try {

Socket s = new Socket(InetAddress.getLocalHost(), 6000);

OutputStream os = s.getOutputStream();

InputStream is = s.getInputStream();

byte[] buf = new byte[100];

int len = is.read(buf);

System.out.println(new String(buf, 0, len));

os.write("Hello,this is zhangsan!".getBytes());

os.close();

is.close();

s.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

2.UDP实现
package myjava.net.socket.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SocketUDP {

public static void main(String[] args) {
if (args.length > 0)
recv();
else
send();
}

public static void recv() {
try {
DatagramSocket ds = new DatagramSocket(6000);

// accept data
byte[] buf = new byte[100];
DatagramPacket dp = new DatagramPacket(buf, 100);
ds.receive(dp);
System.out.println(new String(buf, 0, 100));

// send data
String str = "Welcome you!";
DatagramPacket dpSend = new DatagramPacket(str.getBytes(), str
.length(), dp.getAddress(), dp.getPort());
ds.send(dpSend);

ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void send() {
try {
DatagramSocket ds = new DatagramSocket();

// send data
String str = "Hello, this is zhangsan!";
DatagramPacket dp = new DatagramPacket(str.getBytes(),
str.length(), InetAddress.getLocalHost(), 6000);
ds.send(dp);

// accept data
byte[] buf = new byte[100];
DatagramPacket dbRecv = new DatagramPacket(buf, 100);
ds.receive(dbRecv);
System.out.println(new String(buf, 0, 100));

ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}

}

多个客户同时连接:
主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。

现在实现服务器端编程:(基于TCP方式)
MyServer .java
---------------------------------------------------
package server;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
//这个简单的socket服务器端主要是说句Hello XXX,采用多线程实现
public class MyServer extends Thread {

private Socket s;

public static void main(String[] args) {
     MyServer.server();//main入口,一运行机器,就开通server服务。
}

public MyServer(Socket s) {
     this.s = s;
}

public void run() {
     try {
      OutputStream os = s.getOutputStream();
      InputStream is=s.getInputStream();
      byte[] bu=new byte[20];
      int len=is.read(bu);//从客户端读取消息
      String userName=new String(bu,0,len);
      Date d=new Date();
      System.out.println(userName+" is coming here at "+d.toLocaleString());//写在服务器端控制台的日志显示
      String welcome="hello,"+userName+"!";
      //System.out.println(welcome);
      os.write(welcome.getBytes());//返回给客户端的欢迎信息
      os.close();
      is.close();
      s.close();
     } catch (Exception e) {
      e.printStackTrace();
     }
}

public static void server() {
     try {
      ServerSocket ss = new ServerSocket(9527); //服务器的套接字,端口为9527
      while (true) {
       Socket s = ss.accept();
       new MyServer(s).start(); //用户一进来就运行一个线程
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
}
}


客户端编程:
MyClient .java
---------------------------------
package client;

import java.io.*;
import java.net.*;

public class MyClient {

public static void main(String[] args) {
     //这里先强迫用户输入用户名,调用client(str)方法。
     String str = "";
     try {
      while (str.length() < 1) {
       System.out.println("请输入您的名字");
       str = new DataInputStream(new BufferedInputStream(System.in))
         .readLine();
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
     MyClient.client(str);
}

public static void client(String userName) {
     try {
      Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 9527);//套接字的IP地址和端口号
      OutputStream os = s.getOutputStream();
      InputStream is = s.getInputStream();
      byte[] Name = userName.getBytes("ISO-8859-1"); //这个是为了中文乱码问题
      os.write(Name);//向服务器发送消息
      byte[] serverSay = new byte[100];
      int len = is.read(serverSay);//接受服务器消息
      System.out.println(new String(serverSay, 0, len));//客户端控制台显示服务器返回的信息
      is.close();
      os.close();
      s.close();//记住一定要关闭这些输入,输出流和套接字
     } catch (Exception e) {
      e.printStackTrace();
     }

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值