前言


  通过网络进行数据传输时,一般使用TCP/UDP进行数据传输。但是两个的区别就是TCP可靠,UDP不可靠。两个的共同之处就是都需要建立socket套接字,将IP地址和端口port进行绑定。但是服务器和客户端的socket是有点区别的,服务器端需要显示的指定端口号,以便进行数据监听;而客户端只需要指定IP就行,端口号则由操作系统来分配。

基础类


(1) InetAddress类

  该类就是表示互联网中的IP地址,常用的方法有:

  • getByName(String host) 静态方法,给定主机名来获取IP地址对象
  • getHostAddress()   获取主机的ip地址

(2) InetSocketAddress类

  这个类一看就可socket有关,他就是用来创建socket套接字,将ip地址和端口进行绑定,主要的用法就是其构造器:

  •  InetSocketAddress(InetAddress addr, int port)  //如果addr等于null,则表示绑定本机的所有IP
  •  InetSocketAddress(String hostname,  int port)

服务器端套接字


  这里只简述TCP套接字,我们先看看如果如何写一个简单的服务器,这里先用linux C来实现。

#include "unp.h"
#include <time.h> int main(int argc, char** argv){
int listenfd, connfd;
socketlen_t len;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
time_t ticks; //选择协议族创建套接字3,这里是TCP族
listenfd = Socket(AF_INET, SOCK_STREAM, );
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
//将本机上所有的IP的都进行注册
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//指定监听的端口号
servaddr.sin_port = htons();
//将赋值好结构体seraddr绑定到套接字上
Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
//打开端口监听,第二个参数表示未完成链接的最大个数(正在进行SYN传输)
Listen(listenfd, LISTENQ);
for(;;){
len = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *)&cliaddr, &len);
Write(connfd, buff, strlen(buff));
Close(connfd);
}
}

可以看到在用C实现一个TCP服务器时比较复杂,而java就相对简单一些。

  • java服务器
package com.dy.xidian.net;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept();
String msg = "欢迎使用";
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
bw.write(msg);
bw.flush();
bw.close();
}
}
  • java客户端
package com.dy.xidian.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException; public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket client = new Socket("localhost", 8888);
BufferedReader br = new BufferedReader(new InputStreamReader(
client.getInputStream()));
String echo = br.readLine();
System.out.println(echo);
}
}

分析java套接字


ServerSocket server = new ServerSocket(8888);

我们先看ServerSocket实现方式,其调用了另一个套接字:

public ServerSocket(int port) throws IOException {
this(port, 50, null);
}

ServerSocket的重载函数,主要是用InetSocketAddress创建套接字并进行通过bind进行绑定

 public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
setImpl();
if (port < 0 || port > 0xFFFF)
throw new IllegalArgumentException(
"Port value out of range: " + port);
if (backlog < 1)
backlog = 50;
try {
bind(new InetSocketAddress(bindAddr, port), backlog);
} catch(SecurityException e) {
close();
throw e;
} catch(IOException e) {
close();
throw e;
}
}

在进行bind操作时,同时也调用的监听函数,这里只显示一部分

public void bind(SocketAddress endpoint, int backlog) throws IOException {
//TODO
try {
SecurityManager security = System.getSecurityManager();
if (security != null)
security.checkListen(epoint.getPort());
getImpl().bind(epoint.getAddress(), epoint.getPort());
getImpl().listen(backlog);
bound = true;
}
// TODO
}

总结


  通过上面的观察,我们可以发现虽然java在进行网络编程中的代码相对比较简单,但是其内部的整个流程和C是一样的。对服务器而言都需要经历:创建套接字---绑定套接字----监听端口----接受请求。这个值得注意的是listen会将建立好的套接字(刚完成三次握手)放到一个缓冲队列中,而accept会从缓冲队列中取。由于缓冲队列可能满也可能空,所以listen会出现阻塞(表现为拒绝客户端的链接)。当缓冲区空的时候accept则会阻塞。

java网络编程基础的更多相关文章

  1. Java网络编程基础(Netty预备知识)

    今天在家休息,闲来无事,写篇博客,陶冶下情操~~~ =================我是分割线================ 最近在重新学习Java网络编程基础,以便后续进行Netty的学习. 整 ...

  2. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  3. java网络编程基础——网络基础

    java网络编程 网络编程基础 1.常用的网络拓扑结构: 星型网络.总线网络.环线网络.树形网络.星型环线网络 2.通信协议的组成 通信协议通常由3部分组成: 语义部分:用于决定通信双方对话类型 语法 ...

  4. 【Java基础】Java网络编程基础知识

    什么是网络编程 网络编程是通过使用套接字来达到进程间通信目的,那什么是套接字呢?其实套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的 ...

  5. JAVA网络编程基础知识

    网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协 ...

  6. java网络编程基础——TCP网络编程一

    基于TCP协议的网络编程 TCP/IP协议是一种可靠的网络协议,它的通信的两端各自建立一个Socket,从而在通信的两端之间形成网络虚拟链路. Java使用Socket对象来代表两端的通信端口,并通过 ...

  7. java网络编程基础——基本网络支持

    基本网络支持 java.net包主要为网络编程提供支持. 1.InetAddress InetAddress类代表IP地址,还有两个子类:Inet4Address.Inet6Address. pack ...

  8. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

  9. java 网络编程基础 1

    关于协议: 应用层网络协议包括:http,ftp,telnet,..... 传送层网络协议:使用socket封装的TCP,或UDP 端口: 用于网络通讯时传输数据时区分当前网络连接是与本机中的哪个应用 ...

随机推荐

  1. nyoj 237 游戏高手的烦恼 二分匹配--最小点覆盖

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只 ...

  2. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  3. Socket常见错误

    一.简介 本文介绍 Socket 连接常见错误.   二.常见错误 1)ECONNABORTED 描述:"software caused connection abort",即&q ...

  4. python 标准库和第3方库的介绍

    忘了从哪里来的了~~~~ Tkinter———— Python默认的图形界面接口.Tkinter是一个和Tk接口的模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组.T ...

  5. Linux内核阅读相关

    一.likely()与unlikely()函数的意义 http://blog.chinaunix.net/uid-27665626-id-3506567.html 二.TSO.UFO.GSO.LRO. ...

  6. 【MVC 4】5.SportsSore —— 一个真实的应用程序

     作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 前面建立的都是简单的MVC程序,现在到了吧所有事情综合在一起,以建立一个简单但真实的电子商务应用 ...

  7. ADS(一)

    LC匹配 已知输入输出阻抗,设计LC匹配电路使输入输出阻抗共轭匹配 Step1 Step2 Result1 Result2     微带线单枝匹配 已知源和负载阻抗,求微带线单枝匹配电路 Step1 ...

  8. CSS3实现气泡效果

    首先定义一个 <p class="speech"></p> 先给外层的容器添加样式: p.speech { position: relative; widt ...

  9. UESTC 876 爱管闲事 --DP

    题意:即求给定n个数字(a1,a2,……an),不改变序列,分成M份,使每一份和的乘积最大. 思路:dp[i][j]表示把前i个数字,分成j份所能得到的最大乘积. 转移方程:dp[i][j] = ma ...

  10. 常用Eclipse插件在线安装地址

    Srping IDE http://www.springsource.com/update/e3.5   EasyShellhttp://pluginbox.sourceforge.net   M2E ...