导航:首页 > 编程语言 > javasocket基础

javasocket基础

发布时间:2023-12-01 04:54:55

java简单的socket程序

是可以的,客户端可以多次运行,前提是服务器端必需采用多线程,或是非阻塞的方式来监听客户端的连接请求。服务器端 思想,当客户端连接到来时,利用这个socket创建一个新的线程,并启动。当然,这只不过是最简单的性能最差的方法。你可以使用线程池在java.util.concurrent包中有线程池的实现类Executors你可以通过它的ExecutorService executorService=Executors.newFixedThreadPool(int threadSize);来创建一个线程池。当客户端连接到来时你可以创建一个线程类(handler)然后调用线程池的execute方法指行一个此线程。如:executorService.execute(new Handler(socket));。当然,如果你考虑性能,那么你最好使用nio(非阻塞)来处理,在java.nio.channels包下面有相应的类能处理nio。你可以去查看相关的资料。。

Ⅱ java简答题 如何创建socket连接的过程

java socket建立连接的过程如下:
socket

1、 首先调用Socket类的构造函数,以服务器的指定的IP地址或指定的主机名和指定的端口号为参数,创建一个Socket流,在创建Socket流的过程中包含了向服务器请求建立通讯连接的过程实现。
2、 建立了客户端通讯Socket后。就可以使用Socket的方法getInputStream()和getOutputStream()来创建输入/输出流。这样,使用Socket类后,网络输入输出也转化为使用流对象的过程。
3、 使用输入输出流对象的相应方法读写字节流数据,因为流连接着通讯所用的Socket,Socket又是和服务器端建立连接的一个端点,因此数据将通过连接从服务器得到或发向服务器。这时我们就可以对字节流数据按客户端和服务器之间的协议进行处理,完成双方的通讯任务。
4、 待通讯任务完毕后,我们用流对象的close()方法来关闭用于网络通讯的输入输出流,在用Socket对象的close()方法来关闭Socket。

Ⅲ java Socket通信原理

通过tcp/IP或者udp进行网络通讯。
如果还要继续深究的话,建议你看看网络协议方面的书籍

Ⅳ 浅谈Java中如何利用socket进行网络编程(一)

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。在java中,有专门的socket类来处理用户的请求和响应。利用SOCKET类的方法,就可以实现两台计算机之间的通讯。这里就介绍一下在JAVA中如何利用socket进行网络编程。 在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。 程序可以对这些数据流根据需要进行进一步的封装。本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。 一、建立服务器类 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。ServerSocket server = new ServerSocket(9998) 这条语句创建了一个服务器对象,这个服务器使用9998号端口。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且server.accept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。Socket incoming = server.accept() 进而得到输入流和输出流,并进行封装BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

Ⅳ java中的socket是什么意思

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。x0dx0a以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。x0dx0a重要的Socket API:x0dx0ajava.net.Socket继承于java.lang.Object,有八个构造器,其方法并不闹李多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。x0dx0a. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。x0dx0a. getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。x0dx0a. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。x0dx0a注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。x0dx0a2ServerSocket类例子编辑x0dx0ax0dx0apackage com.lanber.socket;x0dx0aimport java.io.DataInputStream;x0dx0aimport java.io.DataOutputStream;x0dx0aimport java.io.IOException;x0dx0aimport java.net.ServerSocket;x0dx0aimport java.net.Socket;x0dx0apublic class ServerDemo {x0dx0a/**x0dx0a* 注意:Socket的发送与接收是需要同步进行的,即客户端发送一条信息,服务器必需先接收这条信息,x0dx0a* 而后才可以碰吵向客户端发送信息,否则将会有运行时出错。x0dx0a* @param argsx0dx0a*/笑弯侍x0dx0apublic static void main(String[] args) {x0dx0aServerSocket ss = null;x0dx0atry {x0dx0ass = new ServerSocket(8888);x0dx0a//服务器接收到客户端的数据后,创建与此客户端对话的Socketx0dx0aSocket socket = ss.accept();x0dx0a//用于向客户端发送数据的输出流x0dx0aDataOutputStream dos = new DataOutputStream(socket.getOutputStream());x0dx0a//用于接收客户端发来的数据的输入流x0dx0aDataInputStream dis = new DataInputStream(socket.getInputStream());x0dx0aSystem.out.println("服务器接收到客户端的连接请求:" + dis.readUTF());x0dx0a//服务器向客户端发送连接成功确认信息x0dx0ados.writeUTF("接受连接请求,连接成功!");x0dx0a//不需要继续使用此连接时,关闭连接x0dx0asocket.close();x0dx0ass.close();x0dx0a} catch (IOException e) {x0dx0ae.printStackTrace();x0dx0a}x0dx0a}x0dx0a}x0dx0ax0dx0a3客户端的例子编辑x0dx0apackage com.lanber.socket;x0dx0aimportjava.io.DataInputStream;x0dx0aimport java.io.DataOutputStream;x0dx0aimportjava.io.IOException;x0dx0aimport java.io.OutputStream;x0dx0aimport java.net.Socket;x0dx0aimport java.net.UnknownHostException;x0dx0apublic class ClientDemo {x0dx0a/**x0dx0a* @param argsx0dx0a*/x0dx0apublic static void main(String[] args) {x0dx0aSocket socket = null;x0dx0atry {x0dx0asocket = new Socket("localhost",8888);x0dx0a//获取输出流,用于客户端向服务器端发送数据x0dx0aDataOutputStream dos = new DataOutputStream(socket.getOutputStream());x0dx0a//获取输入流,用于接收服务器端发送来的数据x0dx0aDataInputStream dis = new DataInputStream(socket.getInputStream());x0dx0a//客户端向服务器端发送数据x0dx0ados.writeUTF("我是客户端,请求连接!");x0dx0a//打印出从服务器端接收到的数据x0dx0aSystem.out.println(dis.readUTF());x0dx0a//不需要继续使用此连接时,记得关闭哦x0dx0asocket.close();x0dx0a} catch (UnknownHostException e) {x0dx0ae.printStackTrace();x0dx0a} catch (IOException e) {x0dx0ae.printStackTrace();x0dx0a}x0dx0a}x0dx0a}

Ⅵ Java Socket初步详解

网络编程的基本模型就是客户机到服务器模型 简单的说就是两个进程之间相互通讯 然后其中一个必须提供一个固定的位置 而另一个则只需要知道这个固定的位置 并去建立两者之间的联系 然后完成数据的通讯就可以了 这里提供亩悉猜固定位置的通常称为服务器 而建立联系的通常叫做客户端 基于这个简单的模型 就可以进入网络编程啦

Java对这个模型的支持有很多种Api 而这里我只想介绍有关Socket的编程接口 对于Java而言已经简化了Socket的编程接口 首先我们来讨论有关提供固定位置的服务方是如何建立的 Java提供了ServerSocket来对其进行支持 事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你 ServerSocket server=new ServerSocket( );这里稍微要注意的是端口的分配必须是唯一的 因为端口是为了唯一标识每台计算机唯一服务的 另外端口号是从 ~ 之间的 前 个端口已经被Tcp/Ip 作为保留端口 因此你所分配的端口只能是 个之后的 好了 我们有了固定位置 现在所需要的就是一根连接线了 该连接线由客户方首先提出要求 因此Java同样提供了一个Socket对象来对其进行支持 只要客户方创建一个Socket的实例对象进行支持就可以了 Socket client

=new Socket(InetAddress getLocalHost() );客户机必须知道有关服务器的IP地址 对于著一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供 它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法

上面的方法基本可以建立一条连线让两台计算机相互交流了 可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的 因为底层的网络是继续数据的 除非远程调用 处理问题的核心在执行上 否则数据的陆帆交互还是依赖于IO操作的 所以你也必须导入java io这个包 java的IO操作也不复杂 它提供了针对于字节流和Unicode的读者和写者 然后也提供了一个缓冲用于数据的读写

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作 而原始的字节流来源于Socket的两个方法 getInputStream()和getOutputStream()方 分别用来得到输入和输出 那么现在有了基本的模型和基本的操作工具 我们可以做一个简单的Socket例程了

服务方:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

迅型PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

这个程序的主要目的在于服务器不断接收客户机所写入的信息只到 客户机发送 End 字符串就退出程序 并且服务器也会做出 Receive 为回应 告知客户机已接收到消息

客户机代码:

import *;

import java io *;

public class Client{

static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket(InetAddress getLocalHost() );

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

BufferedReader wt=new BufferedReader(new InputStreamReader(System in));

while(true){

String str=wt readLine();

out println(str);

out flush();

if(str equals( end )){

break;

}

System out println(in readLine());

}

server close();

}

}

客户机代码则是接受客户键盘输入 并把该信息输出 然后输出 End 用来做退出标识

这个程序只是简单的两台计算机之间的通讯 如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端 结果是会抛出异常的 那么多个客户端如何实现呢?

其实 简单的分析一下 就可以看出客户和服务通讯的主要通道就是Socket本身 而服务器通过accept方法就是同意和客户建立通讯 这样当客户建立Socket的同时 服务器也会使用这一根连线来先后通讯 那么既然如此只要我们存在多条连线就可以了 那么我们的程序可以变为如下:

服务器:

import java io *;

import *;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

}

这里仅仅只是加了一个外层的While循环 这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互 这里也就是接受到客户的 End 消息 那么现在就实现了多客户之间的交互了 但是 问题又来了 这样做虽然解决了多客户 可是是排队执行的 也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互 无法做到同时服务 那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了 所以线程是最好的解决方案

那么下面的问题是如何使用线程 首先要做的事情是创建线程并使得其可以和网络连线取得联系 然后由线程来执行刚才的操作 要创建线程要么直接继承Thread要么实现Runnable接口 要建立和Socket的联系只要传递引用就可以了 而要执行线程就必须重写run方法 而run方法所做的事情就是刚才单线程版本main所做的事情 因此我们的程序变成了这样:

import *;

import java io *;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

this client=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

//Mutil User but can t parallel

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}catch(IOException ex){

}finally{

}

}

public static void main(String[] args)throws IOException{

ServerSocket server=new ServerSocket( );

while(true){

//transfer location change Single User or Multi User

MultiUser mu=new MultiUser(server accept());

mu start();

}

}

}

lishixin/Article/program/Java/hx/201311/27013

阅读全文

与javasocket基础相关的资料

热点内容
网站功能介绍怎么写 浏览:954
word在试图打开文件时错误 浏览:108
主板无vga插槽怎么连接编程器 浏览:521
录视频文件在哪里删除 浏览:881
word2013如何插入文件 浏览:233
proe教程百度网盘 浏览:197
如何控制远程linux服务器 浏览:740
it教学app有哪些 浏览:34
怎么在ps抠的图变成矢量文件 浏览:405
口袋妖怪银魂安卓v11 浏览:1
网站上芒果tv的账号都是什么 浏览:104
带公式的表格如何刷新数据 浏览:81
数据标注语音和2d哪个好 浏览:145
保存excel文件的方法 浏览:655
手机上看不到电脑上的文件 浏览:626
关于ps的微信公众号 浏览:612
矩阵论教程 浏览:971
字体文件分系统吗 浏览:921
编程一级考试要带什么证件 浏览:923
extjs表格修改前数据 浏览:612

友情链接