java 套接字 访问tcp_java网络编程之套接字TCP

套接字学习

什么是套接字?

计算机网络基础知识

基于套接字的网路编程案例?

什么是套接字?

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程

序通常通过"套接字"向网络发出请求或者应答网络请求。

套接字可以根据通信性质分类,这种性质对于用户是可见的。应用程序一般仅在同一类的

套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。套

接字有两种不同的类型:流套接字和数据报套接字。

计算机网络基础知识

什么是技术机网络:

513ba94bbfdb1909161ad5a0cf07a2da.png

通过有线/无线的链路连接多个计算机设备

进行数据通信或设备共享

标识:

物理: MAC 芯片(网卡/网络适配器/蓝牙/WIFI)

逻辑:IP地址

IP v4 2^32

IP v6 2^128

端口号:port

2^16 0~65535 65536

1024(已占用的端口数目)

http,ftp,ssh,pop,smtp,默认占用了端口(eg:80web端口)

网络通信中标识的网络服务

TCP/IP

应用层 HTTP/HTTPS/pop3/SMTP/SSH/FTP/自定义

传输层 TCP/UDP (套接字)

TCP 传输控制协议

UDP 用户数据报协议

网络层 IP协议

物理层/数据链路层

注意:

后面的博客将会写出TCP/IP学习分享

基于套接字的网路编程案例?

使用线程池实现客户端与服务器的通信,客户端给服务器发送一个字符串,服务器做反转后再发送给客户端.(下面给出一个简单的例子)

客户端程序:

package cn.csuft.poorguy.fileserver;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**

* 客户端

*

* @author Bug研发工程师

*

*/

public class Client {

// 服务器端口

int port = 9000;

// 服务器地址

InetAddress address;

// 客户端TCP套接字

Socket socket;

public Client() {

try {

address = InetAddress.getByName("127.0.0.1");

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

socket = new Socket(address, port);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void start() {

// 先发送

// 再接受字符传反转或变成大写再发送回来

// 服务端实现反转再发回去

// 服务器将小写

try (OutputStream out = socket.getOutputStream()) {

String s = "hello";

out.write(s.getBytes());

out.flush();

InputStream in = socket.getInputStream();

byte[] buf = new byte[128];

int size = in.read(buf);

// String now = new String(buf, 0, size);

// System.out.println("当前时间: " + now);

String s_reverse = new String(buf, 0, size);

System.out.println("转置的结果是: " + s_reverse);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

Client client = new Client();

Client client1 = new Client();

Client client2 = new Client();

client.start();

client1.start();

client2.start();

}

}

服务器端程序:

package cn.csuft.poorguy.fileserver;

import java.io.IOException;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Date;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* 文件服务器(Server)

* 软件:提供服务(对(客户端)请求提供相应)的程序

* @author Bug研发工程师

*

*/

public class FileServer {

//地址

//IP

InetAddress address;

//Port 端口

int port = 9000;

//套接字

//Socket socket

ServerSocket serverSocket;

ExecutorService pool;

public FileServer() {

try {

address = InetAddress.getByName("127.0.0.1");

//for(InetAddress ads : InetAddress.getAllByName("www.baidu.com")) {

//System.out.println(ads.getHostAddress());

//}

} catch (UnknownHostException e) {

e.printStackTrace();

}

//创建服务端套接字

//在当前主机

try {

serverSocket = new ServerSocket(port);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

FileServer server = new FileServer();

server.start();

}

public void start() {

pool = Executors.newCachedThreadPool();

//接受客户端的请求

System.out.println("服务器启动...");

while(true) {

try {

Socket s = serverSocket.accept();

pool.execute(new TimeService(s));

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

多线程程序:

package cn.csuft.poorguy.fileserver;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.util.Date;

public class TimeService implements Runnable{

Socket socket;

public TimeService() {

}

public TimeService(Socket socket) {

this.socket = socket;

}

/**

* 字符串转置

* @param s

* @return

*/

private String reverse(String s) {

char []arr = s.toCharArray();

int limit = arr.length-1;

int middle = arr.length>>1;

for(int i=0;i

char temp = arr[i];

arr[i] = arr[limit-i];

arr[limit-i] = temp;

}

System.out.println(new String(arr));

return new String(arr);

}

@Override

public void run() {

String now = new Date().toLocaleString();

System.out.println(Thread.currentThread().getName()+"处理"+socket.getPort());

try (OutputStream out = socket.getOutputStream()){

InputStream in = socket.getInputStream();

byte []buf = new byte[1024];

int size = in.read(buf);

String s = new String(buf,0,size);

s = reverse(s);

out.write(s.getBytes());

out.flush();

//out.close();

} catch (Exception e) {

// TODO: handle exception

}

}

}

上面是简单的套接字使用的程序,如果有问题请指出,谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值