手机socket 判断端口占用通信,端口本占用,电脑重启后,还会占用么

如何解决python socket server重启后端口被占用的问题_百度知道
如何解决python socket server重启后端口被占用的问题
我有更好的答案
可以在你启动的方法里加一项,检查系统端口是否被占用,占用就Kill掉,不占用正常启动。
采纳率:82%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客访问: 381971
博文数量: 151
博客积分: 455
博客等级: 一等列兵
技术积分: 835
注册时间:
分类: LINUX 20:59:16
socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIXDomain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
UNIX Domain Socket是全双工的,API接口语义丰富,相比其它IPC机制有明显的优越性,目前已成为使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。
使用UNIX Domain Socket的过程和网络socket十分相似,也要先调用socket()创建一个socket文件描述符,address family指定为AF_UNIX,type可以选择SOCK_DGRAM或SOCK_STREAM,protocol参数仍然指定为0即可。
UNIX Domain Socket与网络socket编程最明显的不同在于地址格式不同,用结构体sockaddr_un表示,网络编程的socket地址是IP地址加端口号,而UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回。
今天我们介绍如何编写Linux下的TCP程序,关于UDP程序可以参考这里:
本文绝大部分是参考《Linux程序设计(第4版)》的第15章套接字
服务器端的步骤如下:
1. socket: & & &建立一个socket
2. bind: & & & & &将这个socket绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET),我们会分别介绍这两种。
3. listen: & & & &开始监听
4. accept: & & &如果监听到客户端连接,则调用accept接收这个连接并同时新建一个socket来和客户进行通信
5. read/write:读取或发送数据到客户端
6. close: & & & &通信完成后关闭socket
客户端的步骤如下:
1. socket: & & &建立一个socket
2. connect: & 主动连接服务器端的某个文件(AF_UNIX)或某个端口(AF_INET)
3. read/write:如果服务器同意连接(accept),则读取或发送数据到服务器端
4. close: & & & &通信完成后关闭socket
上面是整个流程,我们先给出一个例子,具体分析会在之后给出。例子实现的功能是客户端发送一个字符到服务器,服务器将这个字符+1后送回客户端,客户端再把它打印出来:
Makefile:
tcp_server.c:
tcp_client.c:
如果我们首先运行tcp_client,会提示没有这个文件:
因为我们是以AF_UNIX方式进行通信的,这种方式是通过文件来将服务器和客户端连接起来的,因此我们应该先运行tcp_server,创建这个文件,默认情况下,这个文件会创建在当前目录下,并且第一个s表示它是一个socket文件:
程序运行的结果如下图:
下面我们详细讲解:
1.我们调用socket函数创建一个socket:
int socket(int domain, int type, int protocol)
domain:指定socket所属的域,常用的是AF_UNIX或AF_INET
AF_UNIX表示以文件方式创建socket,AF_INET表示以端口方式创建socket(我们会在后面详细讲解AF_INET)
type:指定socket的类型,可以是SOCK_STREAM或SOCK_DGRAM
SOCK_STREAM表示创建一个有序的,可靠的,面向连接的socket,因此如果我们要使用TCP,就应该指定为SOCK_STREAM
SOCK_DGRAM表示创建一个不可靠的,无连接的socket,因此如果我们要使用UDP,就应该指定为SOCK_DGRAM
protocol:指定socket的协议类型,我们一般指定为0表示由第一第二两个参数自动选择。
socket()函数返回新创建的socket,出错则返回-1
2.地址格式:
常用的有两种socket域:AF_UNIX或AF_INET,因此就有两种地址格式:sockaddr_un和sockaddr_in,分别定义如下:
其中in_addr正是用来描述一个ip地址的:
从上面的定义我们可以看出,sun_path存放socket的本地文件名,sin_addr存放socket的ip地址,sin_port存放socket的端口号。
3.创建完一个socket后,我们需要使用bind将其绑定:
int bind(int socket, const struct sockaddr * address, size_t address_len)
如果我们使用AF_UNIX来创建socket,相应的地址格式是sockaddr_un,而如果我们使用AF_INET来创建socket,相应的地址格式是sockaddr_in,因此我们需要将其强制转换为sockaddr这一通用的地址格式类型,而sockaddr_un中的sun_family和sockaddr_in中的sin_family分别说明了它的地址格式类型,因此bind()函数就知道它的真实的地址格式。第三个参数address_len则指明了真实的地址格式的长度。
bind()函数正确返回0,出错返回-1
4.接下来我们需要开始监听了:
int listen(int socket, int backlog)
backlog:等待连接的最大个数,如果超过了这个数值,则后续的请求连接将被拒绝
listen()函数正确返回0,出错返回-1
5.接受连接:
int accept(int socket, struct sockaddr * address, size_t * address_len)
同样,第二个参数也是一个通用地址格式类型,这意味着我们需要进行强制类型转化
这里需要注意的是,address是一个传出参数,它保存着接受连接的客户端的地址,如果我们不需要,将address置为NULL即可。
address_len:我们期望的地址结构的长度,注意,这是一个传入和传出参数,传入时指定我们期望的地址结构的长度,如果多于这个值,则会被截断,而当accept()函数返回时,address_len会被设置为客户端连接的地址结构的实际长度。
另外如果没有客户端连接时,accept()函数会阻塞
accept()函数成功时返回新创建的socket描述符,出错时返回-1
6.客户端通过connect()函数与服务器连接:
int connect(int socket, const struct sockaddr * address, size_t address_len)
对于第二个参数,我们同样需要强制类型转换
address_len指明了地址结构的长度
connect()函数成功时返回0,出错时返回-1
7.双方都建立连接后,就可以使用常规的read/write函数来传递数据了
8.通信完成后,我们需要关闭socket:
int close(int fd)
close是一个通用函数(和read,write一样),不仅可以关闭文件描述符,还可以关闭socket描述符
阅读(10950) | 评论(1) | 转发(4) |
给主人留下些什么吧!~~
以文件方式创建socket和以端口方式创建socket那个方式更好一些呢,这个有什么说法
请登录后评论。博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Windows下杀死占用某个端口的进程 - 简书
Windows下杀死占用某个端口的进程
很多情况下,例如:开发Java有关Socket等网络通信的程序时,我们利用某个Port进行调试连接是否成功的过程中,会出现java.net.BindException: Address already in use: JVM_Bind 的错误。
下面,简单说明整个解放某个端口的过程():
一、简单除暴
方法一:重启电脑(麻烦)(实际上关联着:重置所有相关的虚拟器)
方法二:重启编译器(有时会失效)
二、命令行方法
首先,调出终端:
* 方法一:Windows键+r,输入cmd
* 方法二:开始--&搜素“cmd”,点击运行
* 方法三:开始--&运行,输入cmd
终端输入:netstat -ano
目的:输出所有被占用的端口
每一列分别表示:协议 | 本地地址 | 外部地址 | 状态 | PID
终端输入:netstat -ano | findstr 1234
目的:输出所有的1234端口,从而查看最后一列它的PID是多少。
注意:有的电脑会提示:“'netstat '不是内部或外部命令,也不是可运行的程序或者批处理文件”
解决方法:那是因为操作不在系统system32文件夹下,所以只需要输入:
*cd c:\windows\system32*
回车,然后再接着输入即可
终端输入:taskkill
4567【1234端口对应的PID】
成功杀死进程。
Android/Java 研发工程师,旨在与世界各路技术大神交流和共同学习
如何查看程序占用的端口 一、 查看所有进程占用的端口 在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二、查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netst...
开发时经常遇到端口被占用的情况,这个时候总是很令人抓狂,知道被哪个进程占用还好,结束就是了,要是不知道我们该怎么办呢?我告诉大家一个方法,_。1、 开始----&运行----&cmd,或者是window+R组合键,调出命令窗口; 之后我们就可以结束掉这个进程了~~
个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到BS的安装卸载,当时TGP目录下有新包一个uninst_vm.bat批处理文件,双击就能卸载BS的所有相关目录(ps:BS的部分安装文件不在TGP目录下),用n...
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&查看&-&选择列& 经常,我们在启动应用的时候发现系统需要的端口被别的程序占用...
查看网络端口被占用情况 原文 使用命令Netstat –ano|findstr “&端口号&” 查看该PID对应的进程名称 命令查找tasklist|findstr “ ” 软件端口定义 软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构...
大家好,我是微总汇创始人小卡儿!!给大家介绍一下微总汇。
微总汇APP是微商界首款汇聚各界名师大咖的微营销教程APP,帮助微商分析市场趋势和营销技巧,助力于微商快速出货,告诉你如何经营朋友圈如何管理团队,精准引流被加,轻松上百度首页,2017年带你玩赚微商界!欲知更多请加...
没有大风景,没有美人像, 象牙塔的石头独白。【solodaydream】
#打卡# 06月10日 周六 天气多云 身体状态9分 【我的进度】日跑2公里第349天,先坚持1年;每日5点15分前早起第277天,每日seven全身锻炼第193天,每日冥想第102天,每日瑜伽第43天。 【大青蛙】 年度大青蛙:日供一卒,功不唐捐!唯运动和读书不可辜负,每...
黄花高楼,寒露破窗,宛宛一片秋色。夜行归来,偶拾星辰无数。愁绪心头眉梢,冬雪近、不染尘霜。枫叶红,问谁堪折枝,旧梦重来。
2月5日状态非常奇怪,记录一下。。 1,上午:刚到就知道今天自己的任务有点杂,繁琐,而且不好完成,尤其是被工单的一点事儿压着、神烦。 是拖延症导致的么?按说我之前克服了的。还好大侠同学支招我现在还记得清楚,拖延症的两种:我是明显其中之一,因为对某些事没有把握,所以一直往后不...android使用socket于本地PC进行通信的问题
1.自己首先建立个java project.用它做为服务器端的程序,代码如下:
package com.
import java.io.IOE
import java.io.OutputS
import java.net.ServerS
import java.net.S
public class Myserver {
&public static void main(String[] args) {
&& ServerSocket server=new ServerSocket(5000);
&& while(true){
&&& Socket client=server.accept();
&&& OutputStream out=client.getOutputStream();
&&& String msg=&Hello android&;
&&& out.write(msg.getBytes());
&&& client.close();
& } catch (IOException e) {
&& e.printStackTrace();
2.建立android客户端程序,代码如下:
package com.
import java.io.IOE
import java.io.InputS
import java.net.InetA
import java.net.S
import java.net.UnknownHostE
import android.app.A
import android.os.B
import android.util.L
import android.widget.TextV
public class SocketTestActivity extends Activity {
&&& private TextView myTextV
&&& @Override
&&& public void onCreate(Bundle savedInstanceState) {
&&&&&&& super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.main);
&&&&&&& myTextView=(TextView)findViewById(R.id.msgTextView01);
&&&&&&& myTextView.setText(&dd&);
&&&&&&& try {
&& Socket socket=new Socket(&127.0.0.1&,5000);
&&&& myTextView.setText(&ff&);
&& InputStream in=socket.getInputStream();
&& byte[]buffer=new byte[in.available()];
&& in.read(buffer);
&& String msg=new String(buffer);
&& System.out.println(msg);
& } catch (UnknownHostException e) {
&& e.printStackTrace();
& } catch (IOException e) {
&&& myTextView.setText(&ee&);
&& e.printStackTrace();
3.然后运行java project中的程序,查看端口,已经等待监听。
4.运行android应用程序在客户端,报错,无法建立socket连接,错误信息是java.net.PlainSocketImpl.connect,这说明没有连接成功,因为IP地址或端口号错误。
花了好长时间在网上查看原因,有说把ip:127.0.0.1改成10.0.2.0的,结果不行,10.0.2.2是模拟器的IP,相当于本地的127.0.0.1.是android的给每个模拟器分配的IP地址。
有进入cmd,输入ipconfig,直接使用里面的IP的,也不行的。
后来进行端口的映射,使用命令telnet localhost 5554,
diret tcp:,也不行,后来发现这是在两天模拟器上进行请求转发是需要配置的信息,不能完成模拟器和PC的通信的。
最后尝试将端口号写成模拟器的端口号,我,还是不行的。
这都要害死我了。
这才是王道,这才是正解:
在android的官方网站上是这么写的:本地网络连接受限。每个模拟器运行在后台的虚拟路由上,模拟器不能接入物理路由器。于模拟器交互信息可能被本地的防火墙阻塞,或者被你连接的防火墙阻塞。也就是说两个模拟器直接可以通过请求转发实现通信,模拟器和PC不能通信。
我的解决方法:用真机进行测试,通过了。没有真机的,那就没办法了。希望那些还没解决的人不要浪费时间了。期待Google能快点解决这个问题。&
摘自 燕龙安的专栏&

我要回帖

更多关于 java socket 端口占用 的文章

 

随机推荐