首页 技术 正文
技术 2022年11月15日
0 收藏 676 点赞 4,198 浏览 2535 个字

网络socket连接Java API的网络功能包(java.net)已经将底层的TCP连接等都封装好了,我们只需要通过Socket对象来建立客户端和服务器的连接,然后客户端能向服务器发送请求,并接收服务端发来的数据即可 服务端和客户端大概的交互如下所示:java基础九[网络与线程](阅读Head First Java记录)  编写客户端程序 第一步:建立socket连接需要客户端和服务器端都建立以下连接Socket chatSocket=new Socket(“对方IP地址”,TCP端口号); IP类似门牌号,做寻址,找到服务器。端口号是找到这台服务器上的某个程序 端口号是一个用来识别服务器上特定程序的数字,在某台机器上,会唯一标识某个程序每个服务器上的端口号限制为0~65536,而0~1023都已经保留给已知的特定服务(例如HTTP的端口为80,HTTPS的为443),所以我们自己的程序要用1024~65536的端口号,且不要和当前机器已有的程序冲突端口号 第二步:用PrintWriter写数据到Socket上1.建立链接到Socket的PrintWriterPrintWriter writer=new PrintWriter(chatSocket.getOutputStream()); 2.写入数据writer.println(“message to send”);writer.print(“another message”); 第三步:使用BufferedReader从Socket上读取数据Socket可以用串流来进行连接沟通,和上一章讲的文件到对象的串流一样,我们并不在意上游实际是什么,只要是串流BufferedReader就可以接收 1.从Socket连接上获得低层输入串流的InputStreamReaderInputStreamReader stream = new InputStreamReader(chatSocket.getInputStream()); 2.建立BufferedReader来读取InputStreamReaderBufferedReader reader= new BufferedReader(stream);String message=reader.readLine(); 编写简单的服务器程序 服务器的引用程序需要创建两个Socket。一个用来等待用户请求的ServerSocket;一个与用户通信用的Socket。 第一步:使用特定端口创建ServerSocketServerSocket serverSock=new ServerSocket(4242);//该服务器会去监听来4242端口的客户端请求 第二步:客户端对服务器引用程序建立Socket连接Socket sock=new Socket(“127.0.0.1”,4242);//服务器的ip和监听端口 第三步:服务器创建与客户端通信的新SocketSocket sock=serverSock.accept();accept()等待用户连接,如果有用户连接会返回一个和ServerSocket不同端口号的Socket,通过上面讲的PrintWriter来给客户端传送数据如果没有用户连接,那程序会一直停留在accept()这步,直到有用户连入才会执行下一步 说明:一定要先启动服务端后,客户端才可以和服务端进行连接,否则会抛出连接不上Socket的异常 我们什么时候去接口服务端返回的请求呢?隔一段时间去查询一次服务器?或者每次发送信息时都去查询一次?都不是很合理(因为我们要有Socket才能去查询)。java有多线程,可以实现单独开启一个线程,一直用来等待服务器信息 java多线程multithreading 线程:线程是独立的,它有独立的执行空间。每个Java程序都会启动一个主线程(main()),程序需要自己去创建需要的其他线程线程实际上不是并发执行的(除非是多处理器),它是在100毫秒内切换不同的线程去执行(具体由Java虚拟机的线程调度机制决定),让人们感觉是在并行处理的 使用java.lang.Thread类创建线程,它有启动线程、连接线程和让线程闲置的方法 启动一个线程的方法如下:Runnable threadJob=new MyRunnable();//线程要执行的任务,Runnable是一个接口,只有一个public void run(){}方法Thread t=new Thread(threadJob);//建立Thread对象,并赋值Runnable任务t.start();//启动线程,这时才会开启一个线程并执行Runnable任务 线程说明:1.也可以通过继承Thread,子类重写run()方法来创建新进程,但这种方法不建议2.run()是新线程所执行的第一个方法3.线程执行完毕run()后就不能重复启动了4.线程start()后就处于可执行状态5.调度器选择某个线程后,它就处于可执行状态,单处理器的机器只能有一个执行中的线程6.调度不一定是完全公平的,不是所有机器上调度都是完全一致的7.有时线程会因为某些原因堵塞8.添加sleep()会使执行中的线程强制离开执行中状态变为休眠,当sleep时间结束后变为可执行状态 线程并发会引起的问题:数据存取或更新问题如果多个线程操作同一个对象的某一数据(getter或setter),如果其他线程引用时没有去查询当前数据的状态,有可能造成严重的问题。(例如文中的例子A查询余额充足后就进入可执行状态了,B花了钱;A再次进入执行中状态时没有检查余额直接花钱,导致余额不足的情况下扣钱了) 解决方法:通过synchronized关键字添加同步化的方法例如private synchronized void makeWithdrawal(int amount){}说明:每一个对象都一个锁,每个锁只有一把钥匙。通常对象都没有上锁,只有看到同步化的synchronized方法时才会上锁,同步化的目标是保护重要的数据,实际锁住的是存取数据的方法。只有同步化的方法结束后才会放开钥匙 同步化会引发的问题:死锁,如果同步化的两个进程互相需要持有对方正在等待的东西,就会造成死锁   

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,580
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918