基于java的socket编程及API解析

一、socket通讯过程

1、socket与socket编程简介:

socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

我们所说的socket 编程,是站在传输层的基础上,所以可以使用 TCP/UDP 协议,但是不能进行访问网页,因为访问网页所需要的 http 协议位于应用层。作为一个应用程序是能实现该层以下的内容,而不能实现在该层之上的内容。

2、socket通讯过程:

(1)创建ServerSocket和Socket

(2)打开连接到Socket的输入/输出流

(3)按照协议对Socket进行读/写操作

(4)关闭输入输出流、关闭Socket

2、linux中的socket与windows中socket文件之间的区别。

socket作为套接字,能够对数据进行包装后进行发送,socket本质是一个文件。

Linux中是将socket文件视为普通文件,而在windows中将socket文件看成是一个网络连接来对待,因此需要调用专门针对 socket 而设计的数据传输函数。

二、基于java的socket编程

客户端与服务端的使用在控制台的使用代码如下所示。基于java 的Socket编程实践主要调用了java的Socket和ServerSocketAPI,针对服务端需要绑定ServerSocket类,接口绑定后进行监听accept方法,而针对客户端,绑定接口之后采用发送数据的方式。

1、客户端通讯过程

(1)创建Socket对象,指明需要连接的服务器的地址和端口号

(2)连接建立后,通过输出流想服务器端发送请求信息

(3)通过输入流获取服务器响应的信息

(4)关闭响应资源 ???????

import java.io.IOException;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

public class Client{

    public static void testClient(){

       System.out.println("正在向服务器请求连接。。。");

       Socket socket = null;

       Scanner keybordscanner = null;

       Scanner inScanner = null;

       PrintWriter pwtoserver = null;

       try {

//使用的是InetAddress类获取连接到所有Socket编程的

           socket = new Socket(InetAddress.getLocalHost(),6668);

           inScanner = new Scanner(socket.getInputStream());

           System.out.println(inScanner.nextLine());

           pwtoserver = new PrintWriter(socket.getOutputStream());

           System.out.print("我(客户端):");

           keybordscanner = new Scanner(System.in);

           while(keybordscanner.hasNextLine()){

              String keyborddata = keybordscanner.nextLine();

              //客户端发送的消息

              System.out.println("我(客户端):"+keyborddata);

              //写到服务端的的控制台

              pwtoserver.println(keyborddata);

              pwtoserver.flush();

              //阻塞等待接收服务端的消息

              String indata = inScanner.nextLine();

              System.out.println("服务端:"+indata);

              System.out.print("我(客户端):");

           }

       } catch (UnknownHostException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally {

           keybordscanner.close();

           pwtoserver.close();

           inScanner.close();

           try {

              socket.close();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

    public static void main(String[] args) {

       testClient();

    }

}

2、服务端:

(1)创建ServerSocket对象,绑定监听端口

(2)通过accept()方法监听客户端请求

(3)连接建立后,通过输入流读取客户端发送的请求信息

(4)通过输出流向客户端发送乡音信息

(5)关闭相关资源

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

public class Server{

    //服务器

    public static void testServer(){

       //创建一个服务器

       System.out.println("等待客户端连接。。。");

       PrintWriter pwtoclien = null;

       Scanner keybordscanner = null;

       Scanner inScanner = null;

       ServerSocket ss = null;

       try {

           ss = new ServerSocket(6667);

           //创建一个接收连接客户端的对象

           Socket socket = ss.accept();

           System.out.println(socket.getInetAddress()+"已成功连接到此台服务器上。");

           //字符输出流

           pwtoclien = new PrintWriter(socket.getOutputStream());

           pwtoclien.println("已成功连接到远程服务器!"+"\t"+"请您先发言。");

           pwtoclien.flush();

           keybordscanner = new Scanner(System.in);

           inScanner = new Scanner(socket.getInputStream());

           //阻塞等待客户端发送消息过来

           while(inScanner.hasNextLine()){

              String indata = inScanner.nextLine();

              System.out.println("客户端:"+indata);

              System.out.print("我(服务端):");

              String keyborddata = keybordscanner.nextLine();

              System.out.println("我(服务端):"+keyborddata);

              pwtoclien.println(keyborddata);

              pwtoclien.flush();

           }

            socket.shutdownInput();

            socket.shutdownOutput();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally {

           pwtoclien.close();

           keybordscanner.close();

           inScanner.close();

           try {

              ss.close();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

    public static void main(String[] args) {

       testServer();

    }

}

这里采用的是单线程通讯。并且采用了阻塞printWriter.flush的方式控制通讯的顺序:客户端发送消息之后服务端才能回复消息,只有当服务端对客户端进行回应客户端才能再次发送消息,当双方都不进行发送文件时形成了死锁,只有发送文件之后才能解除死锁。

服务端的控制台程序如图所示,使用的是InetAddress类进行获取发送文件的Address。除此之外,编写程序过程中,在两个类中容易弄混淆的是GetInputSream与GetOutputStream,前者是用来读,后者是用来写的。

客户端:客户端在控制台的显示如下所示。

在linux中观察java函数服务端调用的情况

使用的是strace 命令对调用进行追踪

三、linux中网络接口简介

linux中建立连接

站在更贴近系统的层级去看,两个机器间的通信方式,无非是要通过运输层的TCP/UDP,网络层IP,因此socket本质是编程接口(API),对TCP/UDP/IP的封装,TCP/UDP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
Socket的创建:

int socket (int domain, int type, int protocol);

创建一个服务器端的socket

int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

我们套接字已经创建好了,地址结构也已经了解了,接下来就是要将套接字和地址进行关联,关联的方法则是通过bind函数。

int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

我们的socket已经创建出来了,当我们不再使用的时候,我们可以调用close函数来将其关闭,释放该文件描述符,这样便可以得到重新的使用。
套接字通信是双向的,但是,我们可以采用shutdown函数来禁止一个套接字的I/O

 
进行连接

#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

关闭连接

int shutdown(int sockfd, int how);

原文地址:https://www.cnblogs.com/yyl666/p/11982190.html

时间: 2024-11-12 07:55:19

基于java的socket编程及API解析的相关文章

基于java的socket编程

#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好,不用全记得,然后你一个劲地编,使劲地编,编的时候不懂再回来看就好了,这是最快的方法.心里一琢磨,还真是这样,根据以前学C语言的情况不就这样吗.所以便加速看,把一些书里介绍的方法,类飞速地浏览过了,刷到网络这一章,觉得socket编程应该是得试一下手,不要只看不做假把式. 此文为原创,转摘请注明转摘自

基于UDP的socket编程

一.相关函数说明 UDP是无连接的,即发送数据之前不需要建立连接. 除了基于TCP中的socket编程所需的函数之外,基于UDP的socket编程中还需要用到两个函数. 1.sendto函数:用于客户端中指定一目的地发送数据. (1)函数原型 (2)参数说明 sockfd:套接字 buf:待发送数据的缓冲区 len:缓冲区长度 flags:调用方式标志位,一般为0:若改变flags,则sendto发送数据的形式会变成阻塞 dest_addr:指向目的套接字的地址 addrlen:指向目的套接字的

基于win32的socket编程及程序实现

初步研究了win32平台的Windows Sockets,它是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用.包括流式套接字(提供面向连接.可靠的数据传输服务,数据无差错.无重复的发送,且按发送顺序接收.)和数据报套接字(提供无连接服务.数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱.).原始套接字. CS模型:在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户

基于C#的socket编程的TCP异步实现

一.摘要 本篇博文阐述基于TCP通信协议的异步实现. 二.实验平台 Visual Studio 2010 三.异步通信实现原理及常用方法 3.1 建立连接 在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器.相对地,在异步模式下,服务器可以使用BeginAccept方法和EndAccept方法来完成连接到客户端的任务,在客户端则通过BeginConnect方法和EndConnect方法来实现与服务器的连接. BeginAccept在异步方式下

基于java的socket简单聊天编程

socket编程: 一:什么是socket:socket是BSD UNIX的通信机制,通常称为“套接字”,其英文原意是“孔”或“插座”.有些顾名思义,socket正如其英文原意一样,像是一个多孔插座,可以提供多个端口的连接服务.为了更加直观的了解socket,可以用插座来比喻socket.如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”.电器使用的电可以看做是网络资源或者是各种“流”,电是由

java网络socket编程详解

7.2 面向套接字编程    我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式 7.2.1使用套接字实现基于TCP协议的服务器和客户机程序    依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下: 客户端: 1.用服务器的IP地址和端口号实例化Socket对象. 2.调用connect方法,连接到服务器上. 3.将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter

【转】java的socket编程

转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是

基于MFC的socket编程(异步非阻塞通信)

对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其所以而不知起所以然. 异步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式:而同步指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. 阻塞套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直阻塞在此网络调用上,比如调用recv()函数读取网络缓冲区中的数据,

【JAVA】Socket 编程

对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信.这样就有两个Socket了,客户端和服务端各一个. 对于Socket之间的通信其实很简单,服务端往Socket的输出流里面写东西,客户端就可以