一、TCP编程
服务端:
public class Server {
public static void main(String[] args) {
try {
// 1.新建ServerSocket对象,创建指定端口的连接
ServerSocket serverSocket = new ServerSocket(12306);
System.out.println("服务端监听开始了~~~~");
// 2.进行监听
Socket socket = serverSocket.accept();// 开始监听9999端口,并接收到此套接字的连接。
// 3.拿到输入流(客户端发送的信息就在这里)
InputStream is = socket.getInputStream();
// 4.解析数据
InputStreamReader reader = new InputStreamReader(is);
BufferedReader bufReader = new BufferedReader(reader);
String s = null;
StringBuffer sb = new StringBuffer();
while ((s = bufReader.readLine()) != null) {
sb.append(s);
}
System.out.println("服务器:" + sb.toString());
// 关闭输入流
socket.shutdownInput();
OutputStream os = socket.getOutputStream();
os.write(("我是服务端,客户端发给我的数据就是:"+sb.toString()).getBytes());
os.flush();
// 关闭输出流
socket.shutdownOutput();
os.close();
// 关闭IO资源
bufReader.close();
reader.close();
is.close();
socket.close();// 关闭socket
serverSocket.close();// 关闭ServerSocket
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端:
public void onClick(View view){
new Thread(){
@Override
public void run() {
super.run();
try {
//1.创建监听指定服务器地址以及指定服务器监听的端口号
Socket socket = new Socket("111.111.11.11", 12306);
//2.拿到客户端的socket对象的输出流发送给服务器数据
OutputStream os = socket.getOutputStream();
//写入要发送给服务器的数据
os.write(et.getText().toString().getBytes());
os.flush();
socket.shutdownOutput();
//拿到socket的输入流,这里存储的是服务器返回的数据
InputStream is = socket.getInputStream();
//解析服务器返回的数据
InputStreamReader reader = new InputStreamReader(is);
BufferedReader bufReader = new BufferedReader(reader);
String s = null;
final StringBuffer sb = new StringBuffer();
while((s = bufReader.readLine()) != null){
sb.append(s);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(sb.toString());
}
});
//3、关闭IO资源
bufReader.close();
reader.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
二、TCP的多线程编程
服务端:
public class ServerThread extends Thread{
private Socket socket;
//在构造中得到要单独会话的socket
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
super.run();
InputStreamReader reader = null;
BufferedReader bufReader = null;
OutputStream os = null;
try {
reader = new InputStreamReader(socket.getInputStream());
bufReader = new BufferedReader(reader);
String s = null;
StringBuffer sb = new StringBuffer();
while((s = bufReader.readLine()) != null){
sb.append(s);
}
System.out.println("服务器:"+sb.toString());
//关闭输入流
socket.shutdownInput();
//返回给客户端数据
os = socket.getOutputStream();
os.write(("我是服务端,客户端发给我的数据就是:"+sb.toString()).getBytes());
os.flush();
socket.shutdownOutput();
} catch (IOException e2) {
e2.printStackTrace();
} finally{//关闭IO资源
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufReader != null){
try {
bufReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class MultiThreadServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(12306);
//死循环
while(true){
System.out.println("MultiThreadServer~~~监听~~~");
//accept方法会阻塞,直到有客户端与之建立连接
Socket socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
}
} catch (IOException e) {
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
}
}
三、UDP编程
服务端:
public class UDPServer {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[1024];
// 一:接受数据
// 1.创建接受数据的数据包
DatagramPacket packet = new DatagramPacket(buf, buf.length);
// 2.创建UPD 的 socket
DatagramSocket socket = new DatagramSocket(12306);
// 3.接收数据
System.out.println("服务端开始监听!~~~~");
socket.receive(packet);
// 4.处理数据
System.out.println("服务端:" + new String(buf, 0, buf.length));
// 二:返回数据
DatagramPacket p = new DatagramPacket(buf, buf.length, packet.getAddress(), packet.getPort());
socket.send(p);
socket.close();
}
}
客户端:
private void udp() {
byte[] bytes = et.getText().toString().getBytes();
try {
/*******************发送数据***********************/
InetAddress address = InetAddress.getByName("192.168.232.2");
//1.构造数据包
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 12306);
//2.创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket socket = new DatagramSocket();
//3.从此套接字发送数据报包。
socket.send(packet);
/*******************接收数据***********************/
//1.构造 DatagramPacket,用来接收长度为 length 的数据包。
final byte[] bytes1 = new byte[1024];
DatagramPacket receiverPacket = new DatagramPacket(bytes1, bytes1.length);
socket.receive(receiverPacket);
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(new String(bytes1, 0, bytes1.length));
}
});
//socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}